{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OZEjehlD9jb3"
      },
      "source": [
        "#Importing packages\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "2lBQqqGHVprr",
        "outputId": "db67f91d-cf95-4ff1-e17d-bb1051dd7bea"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
            "Requirement already satisfied: nltk in /usr/local/lib/python3.8/dist-packages (3.7)\n",
            "Requirement already satisfied: joblib in /usr/local/lib/python3.8/dist-packages (from nltk) (1.2.0)\n",
            "Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.8/dist-packages (from nltk) (2022.6.2)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.8/dist-packages (from nltk) (4.64.1)\n",
            "Requirement already satisfied: click in /usr/local/lib/python3.8/dist-packages (from nltk) (7.1.2)\n",
            "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
            "Requirement already satisfied: gensim in /usr/local/lib/python3.8/dist-packages (3.6.0)\n",
            "Requirement already satisfied: numpy>=1.11.3 in /usr/local/lib/python3.8/dist-packages (from gensim) (1.21.6)\n",
            "Requirement already satisfied: smart-open>=1.2.1 in /usr/local/lib/python3.8/dist-packages (from gensim) (6.3.0)\n",
            "Requirement already satisfied: scipy>=0.18.1 in /usr/local/lib/python3.8/dist-packages (from gensim) (1.7.3)\n",
            "Requirement already satisfied: six>=1.5.0 in /usr/local/lib/python3.8/dist-packages (from gensim) (1.15.0)\n",
            "Traceback (most recent call last):\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/base_command.py\", line 167, in exc_logging_wrapper\n",
            "    status = run_func(*args)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/req_command.py\", line 199, in wrapper\n",
            "    return func(self, options, args)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/commands/install.py\", line 285, in run\n",
            "    session = self.get_default_session(options)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/req_command.py\", line 75, in get_default_session\n",
            "    self._session = self.enter_context(self._build_session(options))\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/req_command.py\", line 89, in _build_session\n",
            "    session = PipSession(\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/network/session.py\", line 282, in __init__\n",
            "    self.headers[\"User-Agent\"] = user_agent()\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/network/session.py\", line 157, in user_agent\n",
            "    setuptools_dist = get_default_environment().get_distribution(\"setuptools\")\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/metadata/__init__.py\", line 24, in get_default_environment\n",
            "    from .pkg_resources import Environment\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/metadata/pkg_resources.py\", line 9, in <module>\n",
            "    from pip._vendor import pkg_resources\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_vendor/pkg_resources/__init__.py\", line 3252, in <module>\n",
            "    def _initialize_master_working_set():\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_vendor/pkg_resources/__init__.py\", line 3235, in _call_aside\n",
            "    f(*args, **kwargs)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_vendor/pkg_resources/__init__.py\", line 3277, in _initialize_master_working_set\n",
            "    tuple(\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_vendor/pkg_resources/__init__.py\", line 3278, in <genexpr>\n",
            "    dist.activate(replace=False)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_vendor/pkg_resources/__init__.py\", line 2782, in activate\n",
            "    fixup_namespace_packages(self.location)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_vendor/pkg_resources/__init__.py\", line 2295, in fixup_namespace_packages\n",
            "    subpath = _handle_ns(package, path_item)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_vendor/pkg_resources/__init__.py\", line 2201, in _handle_ns\n",
            "    loader = importer.find_module(packageName)\n",
            "  File \"<frozen importlib._bootstrap_external>\", line 546, in _find_module_shim\n",
            "  File \"<frozen importlib._bootstrap_external>\", line 1488, in find_loader\n",
            "  File \"<frozen importlib._bootstrap_external>\", line 1534, in find_spec\n",
            "  File \"<frozen importlib._bootstrap_external>\", line 123, in _path_join\n",
            "  File \"<frozen importlib._bootstrap_external>\", line 123, in <listcomp>\n",
            "KeyboardInterrupt\n",
            "\n",
            "During handling of the above exception, another exception occurred:\n",
            "\n",
            "Traceback (most recent call last):\n",
            "  File \"/usr/local/bin/pip3\", line 8, in <module>\n",
            "    sys.exit(main())\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/main.py\", line 70, in main\n",
            "    return command.main(cmd_args)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/base_command.py\", line 101, in main\n",
            "    return self._main(args)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/base_command.py\", line 221, in _main\n",
            "    return run(options, args)\n",
            "  File \"/usr/local/lib/python3.8/dist-packages/pip/_internal/cli/base_command.py\", line 204, in exc_logging_wrapper\n",
            "    logger.critical(\"Operation cancelled by user\")\n",
            "  File \"/usr/lib/python3.8/logging/__init__.py\", line 1492, in critical\n",
            "    if self.isEnabledFor(CRITICAL):\n",
            "  File \"/usr/lib/python3.8/logging/__init__.py\", line 1689, in isEnabledFor\n",
            "    def isEnabledFor(self, level):\n",
            "KeyboardInterrupt\n",
            "^C\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "[nltk_data] Downloading package punkt to /root/nltk_data...\n",
            "[nltk_data]   Unzipping tokenizers/punkt.zip.\n",
            "/usr/local/lib/python3.8/dist-packages/torch/cuda/__init__.py:497: UserWarning: Can't initialize NVML\n",
            "  warnings.warn(\"Can't initialize NVML\")\n"
          ]
        }
      ],
      "source": [
        "! pip install nltk\n",
        "! pip install gensim\n",
        "! pip install imbalanced-learn\n",
        "\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "\n",
        "import gensim\n",
        "from gensim.models import Word2Vec\n",
        "import nltk\n",
        "nltk.download('punkt')\n",
        "from nltk.tokenize import sent_tokenize, word_tokenize\n",
        "import warnings\n",
        "from collections import defaultdict  # For word frequency\n",
        "import spacy  # For preprocessing\n",
        "warnings.filterwarnings(action = 'ignore')\n",
        "  \n",
        "\n",
        "import random\n",
        "from sklearn.metrics import roc_auc_score, roc_curve, precision_score, auc, precision_recall_curve, plot_roc_curve, classification_report, average_precision_score, matthews_corrcoef\n",
        "from sklearn import svm\n",
        "from sklearn.tree import DecisionTreeClassifier\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics.pairwise import cosine_similarity\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.tree import DecisionTreeClassifier\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.model_selection import StratifiedKFold, LeaveOneOut\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "from sklearn.model_selection import KFold\n",
        "import copy\n",
        "\n",
        "from imblearn.over_sampling import SMOTE, RandomOverSampler\n",
        "from imblearn.under_sampling import RandomUnderSampler\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "E4DPQo6ciHJF"
      },
      "source": [
        "# Data loading -> Drug-Disease associatio keep out based on repeating experiments"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "E1K3aImv-zpt"
      },
      "source": [
        "The associations are based RepoDB database and collected from golden standard database of our prior study, DRP-VEM."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "id": "CHIpDlp6WXO5"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "# making the list of known drug-disease associations \n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = []\n",
        "for a in A:\n",
        "  associations.append(a)\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 105
        },
        "id": "h0-IC2UisxlI",
        "outputId": "045fc3b4-4abd-4f90-96aa-1b7eae136c98"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "Text(0.5, 1.0, 'Type')"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<Figure size 720x720 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "# The frequency of drug-id and indication id\n",
        "\n",
        "sns.countplot(ass['ind_id'])\n",
        "fig = plt.gcf()\n",
        "fig.set_size_inches(10, 10)\n",
        "plt.title('Type')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "hbn2fUcAJyim"
      },
      "outputs": [],
      "source": [
        "freq = ass.groupby(['ind_id'])['drug_id'].agg('count').reset_index()\n",
        "freq = freq.sort_values(by='drug_id', ascending=False)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "id": "lveVLqkSg1N3"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "49Ts6SkknKOi",
        "outputId": "70800a1c-fa1d-4264-dc04-caf88896376e"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of all known drug disease associations in our dataset:  (748, 2)\n",
            "Number of unique disease in Pos:  141\n",
            "Number of uniques drugs in Pos:  410\n"
          ]
        }
      ],
      "source": [
        "# Positive : Known drug-disease associations\n",
        "print(\"The number of all known drug disease associations in our dataset: \",(has.shape))\n",
        "print(\"Number of unique disease in Pos: \",len(list(set(has.ind_id))) )\n",
        "print(\"Number of uniques drugs in Pos: \", len(list(set(has.drug_id))) )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "GZXvtRqpmzZA",
        "outputId": "648b79ab-c4dd-4b44-fe55-70ce3ce5d971"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2)\n",
            "Number of unique disease in Neg:  88\n",
            "Number of uniques drugs in Neg:  361\n"
          ]
        }
      ],
      "source": [
        "# Negatives : Unknown drug-disease associations provided the disease is adverse drug reactoins\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape))\n",
        "print(\"Number of unique disease in Neg: \",len(list(set(hasnt.ind_id))) )\n",
        "print(\"Number of uniques drugs in Neg: \", len(list(set(hasnt.drug_id))) )"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "u0-W14GnITTO"
      },
      "source": [
        "The information of diseases are collected using [DisGeNet](https://www.disgenet.org)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "CBpV3s6Ep9sX"
      },
      "outputs": [],
      "source": [
        "\n",
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "p7mdjCe2RWKp"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "id": "t7dgE79vZq2Q"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "# target_name = target.columns\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "id": "uChMRBszaTLw"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "id": "0EGF5zFsSkTE"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "id": "7ZSOlKfUOBJA"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "id": "usc_IO_5YdZh"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kRXTA448ULst"
      },
      "source": [
        "Extracting drug-disease associations\n",
        "\n",
        "Positive data: Known drug-disease associations\n",
        "\n",
        "Negative data: a subset of unknown drug-disease associations that disease is an adverse drug reaction and common with our side effects\n",
        "\n",
        "More over I did it 10 times for getting the results of 10-experiments."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "id": "ZtriJmeR2mZw"
      },
      "outputs": [],
      "source": [
        "A_test=[]\n",
        "i=0\n",
        "# randomly chose 10% (74) of positive data for test set\n",
        "# then extract those pairs from the documnet of associations that word2vec learns\n",
        "while(i!=74):\n",
        "  a1 = (random.sample(A, 1))\n",
        "  a = a1[0].split(\" \")\n",
        "  a2=a[2].split(\".\")\n",
        "  A_test.append(a1[0])\n",
        "  A.remove(a1[0]) # removing the drug-disease pairs that we aim to check their associations by the model\n",
        "  i+=1\n",
        "\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "SNBl2eMK2mZ1",
        "outputId": "4c126ec6-bafa-4af1-a7d7-d2332b586e33"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of  known drug disease associations without positive test set: (674, 2)\n"
          ]
        }
      ],
      "source": [
        "\n",
        "I=[]\n",
        "for idx, row in has.iterrows():\n",
        "  text=str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if text in A_test: # Extracting test associations from positive data\n",
        "    I.append(idx)\n",
        "has = has.drop(index=I, axis=0)\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fjOm6_gAR9Qp",
        "outputId": "d36ebb89-a0b5-4570-cfdc-42b9015f2449"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2)\n",
            "The number of unknown drug disease associations without negative test set:  (1888, 2)\n"
          ]
        }
      ],
      "source": [
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape))\n",
        "\n",
        "I=[]\n",
        "u=0\n",
        "hasnt_test_idx=random.sample(range(0,hasnt.shape[0]), 78)\n",
        "for idx, row in hasnt.iterrows():\n",
        "  if idx in hasnt_test_idx:\n",
        "    I.append(row)\n",
        "    x = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"  # we extract those has_sideeffect relations from drug which are in negative test set and we consider them as adverse drug reactions\n",
        "    if(x in S):\n",
        "      S.remove(x)\n",
        "      u = u+1\n",
        "hasnt = hasnt.drop(index=hasnt_test_idx, axis=0)\n",
        "print(\"The number of unknown drug disease associations without negative test set: \",(hasnt.shape))\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Vkx6IPHxtWty"
      },
      "source": [
        "# Data loading -> Keep disease out experiments"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WEmfZGHatWt8"
      },
      "source": [
        "Here, every time I divide my disease lists to 10 part. and every time I use 9 parts as train and 1 part as test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "fTFv9Om0tWuC"
      },
      "outputs": [],
      "source": [
        "T=[]\n",
        "dic_dis={}\n",
        "i=0\n",
        "for d in my_disease_list:\n",
        "  dic_dis[i]=d\n",
        "  i+=1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bsvnPIg6vdWJ"
      },
      "outputs": [],
      "source": [
        "def list_of_disease_test(T):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=14:\n",
        "    num = random.randint(0, 140)\n",
        "    if num in T:\n",
        "      continue\n",
        "    else:\n",
        "      T.append(num)\n",
        "      new_test.append(num)\n",
        "      i+=1\n",
        "  return new_test\n",
        "  "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jSm3Nsjmv5W2"
      },
      "outputs": [],
      "source": [
        "test1 = list_of_disease_test(T)\n",
        "train1 = dic_dis.keys()-test1\n",
        "\n",
        "test2 = list_of_disease_test(T)\n",
        "train2 = dic_dis.keys()-test2\n",
        "\n",
        "test3 = list_of_disease_test(T)\n",
        "train3 = dic_dis.keys()-test3\n",
        "\n",
        "test4 = list_of_disease_test(T)\n",
        "train4 = dic_dis.keys()-test4\n",
        "\n",
        "test5 = list_of_disease_test(T)\n",
        "train5 = dic_dis.keys()-test5\n",
        "\n",
        "test6 = list_of_disease_test(T)\n",
        "train6 = dic_dis.keys()-test6\n",
        "\n",
        "test7 = list_of_disease_test(T)\n",
        "train7 = dic_dis.keys()-test7\n",
        "\n",
        "test8 = list_of_disease_test(T)\n",
        "train8 = dic_dis.keys()-test8\n",
        "\n",
        "test9 = list_of_disease_test(T)\n",
        "train9 = dic_dis.keys()-test9\n",
        "\n",
        "test10 = list_of_disease_test(T)\n",
        "train10 = dic_dis.keys()-test10"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7hAJkhxFtWt9"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "# making the list of known drug-disease associations \n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = []\n",
        "for a in A:\n",
        "  associations.append(a)\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "0o27rBletWuA"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "DwfLdFOrtWuB",
        "outputId": "ef5dbe2a-5712-42f8-a1f6-99c068614097"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of all known drug disease associations in our dataset:  (748, 2)\n",
            "Number of unique disease in Pos:  141\n",
            "Number of uniques drugs in Pos:  410\n"
          ]
        }
      ],
      "source": [
        "# Positive : Known drug-disease associations\n",
        "print(\"The number of all known drug disease associations in our dataset: \",(has.shape))\n",
        "print(\"Number of unique disease in Pos: \",len(list(set(has.ind_id))) )\n",
        "print(\"Number of uniques drugs in Pos: \", len(list(set(has.drug_id))) )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "HcWqqsS8tWuB",
        "outputId": "464e8d63-1260-4d11-a77f-fbeac0baefab"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2)\n",
            "Number of unique disease in Neg:  88\n",
            "Number of uniques drugs in Neg:  361\n"
          ]
        }
      ],
      "source": [
        "# Negatives : Unknown drug-disease associations provided the disease is adverse drug reactoins\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape))\n",
        "print(\"Number of unique disease in Neg: \",len(list(set(hasnt.ind_id))) )\n",
        "print(\"Number of uniques drugs in Neg: \", len(list(set(hasnt.drug_id))) )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "a2_Ws0RG1Fnk"
      },
      "outputs": [],
      "source": [
        "test_dis = []\n",
        "train_dis =[]\n",
        "for i in dic_dis.keys():\n",
        "  if i in test9:\n",
        "    test_dis.append(dic_dis[i])\n",
        "  else:\n",
        "      train_dis.append(dic_dis[i])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "nYTjb3OctWuD"
      },
      "source": [
        "The information of diseases are collected using [DisGeNet](https://www.disgenet.org)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Px_a8WPNtWuD"
      },
      "outputs": [],
      "source": [
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CARCbnnCtWuE"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_D_Vt2x4tWuE"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "pviUIAlbtWuF"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ZE9_lwrGtWuF"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "G18Kh1ustWuF"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true
        },
        "id": "DgDQva9dtWuG"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FxqNvT22tWuG"
      },
      "source": [
        "Extracting drug-disease associations\n",
        "\n",
        "Positive data: Known drug-disease associations\n",
        "\n",
        "Negative data: a subset of unknown drug-disease associations that disease is an adverse drug reaction and common with our side effects\n",
        "\n",
        "More over I did it 10 times for getting the results of 10-fold cross validation based on positive data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "M-Phhct7tWuI",
        "outputId": "6d0514a1-71a8-4f98-866e-86c343fc33d3"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "748\n",
            "707 41\n"
          ]
        }
      ],
      "source": [
        "A_test=[]\n",
        "i=0\n",
        "print(len(A))\n",
        "# randomly chose 10% (74) of positive data for test set\n",
        "# then extract those pairs from the documnet of associations that word2vec learns\n",
        "for idx, row in has.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if row.ind_id in test_dis:\n",
        "    A.remove(text)\n",
        "    A_test.append(text)\n",
        "print(len(A), len(A_test))\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "VS9ThUPjtWuI",
        "outputId": "0fe427ee-0475-45d6-a8c0-272328cf66a7"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of  known drug disease associations without positive test set: (707, 2)\n"
          ]
        }
      ],
      "source": [
        "has = has.loc[has['ind_id'].isin(train_dis)]\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "WBB9-pOmtWuJ",
        "outputId": "1650b255-f87c-42ee-fc50-b9ea2cacc70d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2) 64121\n",
            "The number of  known drug disease associations without positive test set: (1932, 2) 64087\n"
          ]
        }
      ],
      "source": [
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape), len(S))\n",
        "\n",
        "I=[]\n",
        "for idx, row in hasnt.iterrows():\n",
        "  text = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"\n",
        "  if row.ind_id in test_dis:\n",
        "    S.remove(text)\n",
        "    I.append(row)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(train_dis)]\n",
        "print(\"The number of  known drug disease associations without positive test set:\",hasnt.shape, len(S))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OMH8JGZ0RfLi"
      },
      "source": [
        "# Data loading -> Keep Drugs out experiments"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ig3unwbaRfLk"
      },
      "source": [
        "Here, every time I divide my disease lists to 10 part. and every time I use 9 parts as train and 1 part as test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "iQ_0SgfKRfLl"
      },
      "outputs": [],
      "source": [
        "T=[]\n",
        "dic_drug={}\n",
        "i=0\n",
        "for d in my_drug_list:\n",
        "  dic_drug[i]=d\n",
        "  i+=1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "a649yEXcRfLl"
      },
      "outputs": [],
      "source": [
        "def list_of_drug_test(T):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=41:\n",
        "    num = random.randint(0, 410)\n",
        "    if num in T:\n",
        "      continue\n",
        "    else:\n",
        "      T.append(num)\n",
        "      new_test.append(num)\n",
        "      i+=1\n",
        "  return new_test\n",
        "  "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "tGP6b9L_RfLm"
      },
      "outputs": [],
      "source": [
        "test1 = list_of_drug_test(T)\n",
        "\n",
        "test2 = list_of_drug_test(T)\n",
        "\n",
        "test3 = list_of_drug_test(T)\n",
        "\n",
        "test4 = list_of_drug_test(T)\n",
        "\n",
        "test5 = list_of_drug_test(T)\n",
        "\n",
        "test6 = list_of_drug_test(T)\n",
        "\n",
        "test7 = list_of_drug_test(T)\n",
        "\n",
        "test8 = list_of_drug_test(T)\n",
        "\n",
        "test9 = list_of_drug_test(T)\n",
        "\n",
        "test10 = list_of_drug_test(T)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "il0WJSwoRfLm"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "# making the list of known drug-disease associations \n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = []\n",
        "for a in A:\n",
        "  associations.append(a)\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "X92mGGC2RfLn"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "LOoie8cJRfLn",
        "outputId": "24d3fd0a-16aa-4207-8f2a-e98618fb72d9"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of all known drug disease associations in our dataset:  (748, 2)\n",
            "Number of unique disease in Pos:  141\n",
            "Number of uniques drugs in Pos:  410\n"
          ]
        }
      ],
      "source": [
        "# Positive : Known drug-disease associations\n",
        "print(\"The number of all known drug disease associations in our dataset: \",(has.shape))\n",
        "print(\"Number of unique disease in Pos: \",len(list(set(has.ind_id))) )\n",
        "print(\"Number of uniques drugs in Pos: \", len(list(set(has.drug_id))) )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "dflnlWffRfLo",
        "outputId": "60a11c23-c3ed-4031-f309-c402108628c5"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2)\n",
            "Number of unique disease in Neg:  88\n",
            "Number of uniques drugs in Neg:  361\n"
          ]
        }
      ],
      "source": [
        "# Negatives : Unknown drug-disease associations provided the disease is adverse drug reactoins\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape))\n",
        "print(\"Number of unique disease in Neg: \",len(list(set(hasnt.ind_id))) )\n",
        "print(\"Number of uniques drugs in Neg: \", len(list(set(hasnt.drug_id))) )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jUS3APosRfLp"
      },
      "outputs": [],
      "source": [
        "test_drug = []\n",
        "train_drug =[]\n",
        "for i in dic_drug.keys():\n",
        "  if i in test1:\n",
        "    test_drug.append(dic_drug[i])\n",
        "  else:\n",
        "      train_drug.append(dic_drug[i])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NP1RdYABRfLq"
      },
      "source": [
        "The information of diseases are collected using [DisGeNet](https://www.disgenet.org)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "TbNJV0KbRfLr"
      },
      "outputs": [],
      "source": [
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xVylw9pqRfLr"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "msg4-4yURfLr"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "aEFv9PWhRfLs"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "U4KWzyCoRfLs"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4hGvjj-4RfLs"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true
        },
        "id": "Mv5ZVYxeRfLs"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-DBFI-QWRfLs"
      },
      "source": [
        "Extracting drug-disease associations\n",
        "\n",
        "Positive data: Known drug-disease associations\n",
        "\n",
        "Negative data: a subset of unknown drug-disease associations that disease is an adverse drug reaction and common with our side effects\n",
        "\n",
        "More over I did it 10 times for getting the results of 10-fold cross validation based on positive data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "qV3Nrp59RfLs",
        "outputId": "6d0514a1-71a8-4f98-866e-86c343fc33d3"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "748\n",
            "707 41\n"
          ]
        }
      ],
      "source": [
        "A_test=[]\n",
        "i=0\n",
        "print(len(A))\n",
        "\n",
        "for idx, row in has.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if row.drug_id in test_drug:\n",
        "    A.remove(text)\n",
        "    A_test.append(text)\n",
        "print(len(A), len(A_test))\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "5xxiyjzMRfLt",
        "outputId": "039165b1-8045-49d9-f4e9-4ab1c9edf757"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of  known drug disease associations without positive test set: (669, 2)\n"
          ]
        }
      ],
      "source": [
        "has = has.loc[has['drug_id'].isin(train_drug)]\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "iHZ-dsuORfLt",
        "outputId": "1650b255-f87c-42ee-fc50-b9ea2cacc70d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2) 64121\n",
            "The number of  known drug disease associations without positive test set: (1932, 2) 64087\n"
          ]
        }
      ],
      "source": [
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape), len(S))\n",
        "\n",
        "I=[]\n",
        "for idx, row in hasnt.iterrows():\n",
        "  text = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"\n",
        "  if row.drug_id in test_drug:\n",
        "    S.remove(text)\n",
        "    I.append(row)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)\n",
        "hasnt = hasnt.loc[hasnt['drug_id'].isin(train_drug)]\n",
        "print(\"The number of  known drug disease associations without positive test set:\",hasnt.shape, len(S))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BVm5hdaR-BhZ"
      },
      "source": [
        "# Data loading -> 10 fold cross-validation -> Stratified"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KJDKDnx8-Bha"
      },
      "source": [
        "Here, every time I divide my disease lists to 10 part. and every time I use 9 parts as train and 1 part as test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "l8dviM5P-6XT"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "pos_index = has.index\n",
        "neg_index = hasnt.index\n",
        "T_pos = []  # To keep the selected indexes of positive pairs and prevnt their selection in the next test set\n",
        "T_neg = []"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "GN3BZBQC-Bha"
      },
      "outputs": [],
      "source": [
        "def list_of_pos_test(T_pos):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=74:\n",
        "    num = random.randint(0, len(pos_index)-1)\n",
        "    if pos_index[num] in T_pos:\n",
        "      continue\n",
        "    else:\n",
        "      T_pos.append(pos_index[num])\n",
        "      new_test.append(pos_index[num])\n",
        "      i+=1\n",
        "  return new_test\n",
        "  "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3vNIrPge-N61"
      },
      "outputs": [],
      "source": [
        "def list_of_neg_test(T_neg):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=196:\n",
        "    num = random.randint(0, len(neg_index)-1)\n",
        "    if neg_index[num] in T_neg:\n",
        "      continue\n",
        "    else:\n",
        "      T_neg.append(neg_index[num])\n",
        "      new_test.append(neg_index[num])\n",
        "      i+=1\n",
        "  return new_test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "mvo6knp_-Bhb"
      },
      "outputs": [],
      "source": [
        "# In this step, we divide our positive and negative pairs to 10 fold\n",
        "# Caution: This step should repeat only one time\n",
        "\n",
        "testP1 = list_of_pos_test(T_pos)\n",
        "testN1 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP2 = list_of_pos_test(T_pos)\n",
        "testN2 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP3 = list_of_pos_test(T_pos)\n",
        "testN3 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP4 = list_of_pos_test(T_pos)\n",
        "testN4 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP5 = list_of_pos_test(T_pos)\n",
        "testN5 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP6 = list_of_pos_test(T_pos)\n",
        "testN6 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP7 = list_of_pos_test(T_pos)\n",
        "testN7 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP8 = list_of_pos_test(T_pos)\n",
        "testN8 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP9 = list_of_pos_test(T_pos)\n",
        "testN9 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP10 = list_of_pos_test(T_pos)\n",
        "testN10 = list_of_neg_test(T_neg)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "tVydwhh7-Bhb"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "# making the list of known drug-disease associations \n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = []\n",
        "for a in A:\n",
        "  associations.append(a)\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "nxvYdxg3-Bhb"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kj5q-P4P-Bhb",
        "outputId": "24d3fd0a-16aa-4207-8f2a-e98618fb72d9"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of all known drug disease associations in our dataset:  (748, 2)\n",
            "Number of unique disease in Pos:  141\n",
            "Number of uniques drugs in Pos:  410\n"
          ]
        }
      ],
      "source": [
        "# Positive : Known drug-disease associations\n",
        "print(\"The number of all known drug disease associations in our dataset: \",(has.shape))\n",
        "print(\"Number of unique disease in Pos: \",len(list(set(has.ind_id))) )\n",
        "print(\"Number of uniques drugs in Pos: \", len(list(set(has.drug_id))) )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "JYlVnMhp-Bhc",
        "outputId": "60a11c23-c3ed-4031-f309-c402108628c5"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2)\n",
            "Number of unique disease in Neg:  88\n",
            "Number of uniques drugs in Neg:  361\n"
          ]
        }
      ],
      "source": [
        "# Negatives : Unknown drug-disease associations provided the disease is adverse drug reactoins\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape))\n",
        "print(\"Number of unique disease in Neg: \",len(list(set(hasnt.ind_id))) )\n",
        "print(\"Number of uniques drugs in Neg: \", len(list(set(hasnt.drug_id))) )"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "z3fKj8cq-Bhc"
      },
      "source": [
        "The information of diseases are collected using [DisGeNet](https://www.disgenet.org)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hOtEpS82-Bhd"
      },
      "outputs": [],
      "source": [
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mCFgCAx5-Bhd"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "h7pCqffV-Bhd"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Um_4Rvvm-Bhd"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "vM9iMw6j-Bhd"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "U2kMlDfU-Bhe"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true
        },
        "id": "z8eWXWxN-Bhe"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qtOe5DtF-Bhe"
      },
      "source": [
        "Extracting drug-disease associations\n",
        "\n",
        "Positive data: Known drug-disease associations\n",
        "\n",
        "Negative data: a subset of unknown drug-disease associations that disease is an adverse drug reaction and common with our side effects\n",
        "\n",
        "More over I did it 10 times for getting the results of 10-fold cross validation based on positive data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "yrF1pfjx-Bhe",
        "outputId": "6d0514a1-71a8-4f98-866e-86c343fc33d3"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "748\n",
            "707 41\n"
          ]
        }
      ],
      "source": [
        "# to make the positive test set, every time we only change the name of testPi, 1<=i<=10\n",
        "\n",
        "A_test=[]\n",
        "i=0\n",
        "print(len(A))\n",
        "\n",
        "for idx, row in has.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if idx in testP1:   # HERE we change the number of i for  i<=i<=10\n",
        "    A.remove(text)\n",
        "    A_test.append(text)\n",
        "print(len(A), len(A_test))\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c\n",
        "\n",
        "has = has.drop(testP1)  # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "3tJumCWd-Bhf",
        "outputId": "1650b255-f87c-42ee-fc50-b9ea2cacc70d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2) 64121\n",
            "The number of  known drug disease associations without positive test set: (1932, 2) 64087\n"
          ]
        }
      ],
      "source": [
        "# The negative training and test set based on testNi for 1<=i<=10\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape), len(S))\n",
        "\n",
        "I=[]\n",
        "for idx, row in hasnt.iterrows():\n",
        "  text = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"\n",
        "  if idx in testN1:   # HERE we change the number of i for 1<=i<=10\n",
        "    S.remove(text)\n",
        "    I.append(row)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)\n",
        "hasnt = hasnt.drop(testN1)   # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",hasnt.shape, len(S))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2VbrpqNw6cDq"
      },
      "source": [
        "# Data loading -> 10 fold cross-validation -> BALANCED"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fIVwOnmc6cDv"
      },
      "source": [
        "Here, every time I divide my disease lists to 10 part. and every time I use 9 parts as train and 1 part as test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "eXW0bf7_6cDw"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "pos_index = has.index\n",
        "neg_index = hasnt.index\n",
        "T_pos = []  # To keep the selected indexes of positive pairs and prevnt their selection in the next test set\n",
        "T_neg = []"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "zrhBwQvO6cDx"
      },
      "outputs": [],
      "source": [
        "def list_of_pos_test(T_pos):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=74:\n",
        "    num = random.randint(0, len(pos_index)-1)\n",
        "    if pos_index[num] in T_pos:\n",
        "      continue\n",
        "    else:\n",
        "      T_pos.append(pos_index[num])\n",
        "      new_test.append(pos_index[num])\n",
        "      i+=1\n",
        "  return new_test\n",
        "  "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "946ZZPqh6cDy"
      },
      "outputs": [],
      "source": [
        "def list_of_neg_test(T_neg):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=74:\n",
        "    num = random.randint(0, len(neg_index)-1)\n",
        "    if neg_index[num] in T_neg:\n",
        "      continue\n",
        "    else:\n",
        "      T_neg.append(neg_index[num])\n",
        "      new_test.append(neg_index[num])\n",
        "      i+=1\n",
        "  return new_test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bjKK40fH6cDz"
      },
      "outputs": [],
      "source": [
        "# In this step, we divide our positive and negative pairs to 10 fold\n",
        "# Caution: This step should repeat only one time\n",
        "\n",
        "testP1 = list_of_pos_test(T_pos)\n",
        "testN1 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP2 = list_of_pos_test(T_pos)\n",
        "testN2 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP3 = list_of_pos_test(T_pos)\n",
        "testN3 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP4 = list_of_pos_test(T_pos)\n",
        "testN4 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP5 = list_of_pos_test(T_pos)\n",
        "testN5 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP6 = list_of_pos_test(T_pos)\n",
        "testN6 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP7 = list_of_pos_test(T_pos)\n",
        "testN7 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP8 = list_of_pos_test(T_pos)\n",
        "testN8 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP9 = list_of_pos_test(T_pos)\n",
        "testN9 = list_of_neg_test(T_neg)\n",
        "\n",
        "testP10 = list_of_pos_test(T_pos)\n",
        "testN10 = list_of_neg_test(T_neg)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "E68_y7Y_6cDz"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "# making the list of known drug-disease associations \n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = []\n",
        "for a in A:\n",
        "  associations.append(a)\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "EjGTKGCo6cD0"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "wHQvTJ9L6cD0",
        "outputId": "851202d9-d79c-4299-9c1f-9f4c7c9b6524"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of all known drug disease associations in our dataset:  (748, 2)\n",
            "Number of unique disease in Pos:  141\n",
            "Number of uniques drugs in Pos:  410\n"
          ]
        }
      ],
      "source": [
        "# Positive : Known drug-disease associations\n",
        "print(\"The number of all known drug disease associations in our dataset: \",(has.shape))\n",
        "print(\"Number of unique disease in Pos: \",len(list(set(has.ind_id))) )\n",
        "print(\"Number of uniques drugs in Pos: \", len(list(set(has.drug_id))) )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "QUY-XnrU6cD1",
        "outputId": "11f18fba-d6dc-42cd-e26d-82186d9ffd16"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2)\n",
            "Number of unique disease in Neg:  88\n",
            "Number of uniques drugs in Neg:  361\n"
          ]
        }
      ],
      "source": [
        "# Negatives : Unknown drug-disease associations provided the disease is adverse drug reactoins\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape))\n",
        "print(\"Number of unique disease in Neg: \",len(list(set(hasnt.ind_id))) )\n",
        "print(\"Number of uniques drugs in Neg: \", len(list(set(hasnt.drug_id))) )"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oQFJxJFu6cD2"
      },
      "source": [
        "The information of diseases are collected using [DisGeNet](https://www.disgenet.org)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ufSbzatz6cD2"
      },
      "outputs": [],
      "source": [
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "h1uKByhU6cD2"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CIZ7-AN66cD3"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CdFPbrNO6cD3"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Wv17N-HN6cD4"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3aeWouLY6cD4"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "d34aIqy86cD4"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "soON2pOq6cD4"
      },
      "source": [
        "Extracting drug-disease associations\n",
        "\n",
        "Positive data: Known drug-disease associations\n",
        "\n",
        "Negative data: a subset of unknown drug-disease associations that disease is an adverse drug reaction and common with our side effects\n",
        "\n",
        "More over I did it 10 times for getting the results of 10-fold cross validation based on positive data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "73d11lTz6cD5",
        "outputId": "4091eb97-514e-45f1-80ee-0397c3b61943"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "748\n",
            "674 74\n",
            "The number of  known drug disease associations without positive test set: (674, 2)\n"
          ]
        }
      ],
      "source": [
        "# to make the positive test set, every time we only change the name of testPi, 1<=i<=10\n",
        "\n",
        "A_test=[]\n",
        "i=0\n",
        "print(len(A))\n",
        "\n",
        "for idx, row in has.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if idx in testP10:   # HERE we change the number of i for  i<=i<=10\n",
        "    A.remove(text)\n",
        "    A_test.append(text)\n",
        "print(len(A), len(A_test))\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c\n",
        "\n",
        "has = has.drop(testP10)  # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "nEVdqfNn6cD5",
        "outputId": "b5134002-e3a4-44de-fe86-680d01ba2a11"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2) 64121\n",
            "The number of  known drug disease associations without positive test set: (1892, 2) 64047\n"
          ]
        }
      ],
      "source": [
        "# The negative training and test set based on testNi for 1<=i<=10\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape), len(S))\n",
        "\n",
        "I=[]\n",
        "for idx, row in hasnt.iterrows():\n",
        "  text = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"\n",
        "  if idx in testN10:   # HERE we change the number of i for 1<=i<=10\n",
        "    S.remove(text)\n",
        "    I.append(row)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)\n",
        "hasnt = hasnt.drop(testN10)   # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",hasnt.shape, len(S))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YOMdcp3u5hQI"
      },
      "source": [
        "# Data loading -> The test set of DRP-VEM"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ivvHE5zQ51zg"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "# making the list of known drug-disease associations \n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = []\n",
        "for a in A:\n",
        "  associations.append(a)\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "amqwLZE410lF"
      },
      "outputs": [],
      "source": [
        "def list_of_pos_test(T_pos):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=74:\n",
        "    num = random.randint(0, len(pos_index)-1)\n",
        "    if pos_index[num] in T_pos:\n",
        "      continue\n",
        "    else:\n",
        "      T_pos.append(pos_index[num])\n",
        "      new_test.append(pos_index[num])\n",
        "      i+=1\n",
        "  return new_test\n",
        "  "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "fn15c-0210lP"
      },
      "outputs": [],
      "source": [
        "def list_of_neg_test(T_neg):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=74:\n",
        "    num = random.randint(0, len(neg_index)-1)\n",
        "    if neg_index[num] in T_neg:\n",
        "      continue\n",
        "    else:\n",
        "      T_neg.append(neg_index[num])\n",
        "      new_test.append(neg_index[num])\n",
        "      i+=1\n",
        "  return new_test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "SY9Zq9Ne51zn"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "pos_index = has.index\n",
        "neg_index = hasnt.index\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "O-nIML3w51zm"
      },
      "outputs": [],
      "source": [
        "T_pos = []\n",
        "T_neg = []\n",
        "\n",
        "test_positive = list_of_pos_test(T_pos)\n",
        "test_negative = list_of_neg_test(T_neg)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SdtBOpCI51zp"
      },
      "source": [
        "The information of diseases are collected using [DisGeNet](https://www.disgenet.org)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3xiTvzWG51zp"
      },
      "outputs": [],
      "source": [
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qohQMNN151zq"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ipeMfv2p51zq"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "# target_name = target.columns\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "BysefeQC51zr"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ETM8Ztjk51zr"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "eJMN2XEc51zs"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "IQloaaYM51zs"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "lbuACVKV2Sso",
        "outputId": "f7d2247d-5ec1-4ee6-bd0f-b288f0cbd1bb"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "748\n",
            "674 74\n",
            "The number of  known drug disease associations without positive test set: (674, 2)\n"
          ]
        }
      ],
      "source": [
        "# to make the positive test set, every time we only change the name of testPi, 1<=i<=10\n",
        "\n",
        "A_test=[]\n",
        "i=0\n",
        "print(len(A))\n",
        "\n",
        "for idx, row in has.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if idx in test_positive:   # HERE we change the number of i for  i<=i<=10\n",
        "    A.remove(text)\n",
        "    A_test.append(text)\n",
        "print(len(A), len(A_test))\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c\n",
        "\n",
        "has = has.drop(test_positive)  # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "y2rtE9zV2Sth",
        "outputId": "b238f554-72f7-4293-c9f8-37ff5664bfe3"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2) 64121\n",
            "The number of  known drug disease associations without positive test set: (1892, 2) 64047\n"
          ]
        }
      ],
      "source": [
        "# The negative training and test set based on testNi for 1<=i<=10\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape), len(S))\n",
        "\n",
        "I=[]\n",
        "for idx, row in hasnt.iterrows():\n",
        "  text = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"\n",
        "  if idx in test_negative:   # HERE we change the number of i for 1<=i<=10\n",
        "    S.remove(text)\n",
        "    I.append(row)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)\n",
        "hasnt = hasnt.drop(test_negative)   # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",hasnt.shape, len(S))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iv0gfj8cLzOB"
      },
      "source": [
        "# Checking the roubustness of model based on article 'Drug-Disease Association Prediction Using Heterogeneous Networks for Computational Drug Repositioning'"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "w_ALY1LOMF1u"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "# making the list of known drug-disease associations \n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = []\n",
        "for a in A:\n",
        "  associations.append(a)\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "szZ9_tjjMF1w"
      },
      "outputs": [],
      "source": [
        "def list_of_pos_test(T_pos):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=67: # 67 in case of removing and 74 in normal\n",
        "    num = random.randint(0, len(pos_index)-1)\n",
        "    if pos_index[num] in T_pos:\n",
        "      continue\n",
        "    else:\n",
        "      T_pos.append(pos_index[num])\n",
        "      new_test.append(pos_index[num])\n",
        "      i+=1\n",
        "  return new_test\n",
        "  "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "KMcPB1k3MF1x"
      },
      "outputs": [],
      "source": [
        "def list_of_neg_test(T_neg):\n",
        "  i=0\n",
        "  new_test=[]\n",
        "  while i!=189: # 189 in case of removing and 196 in normal\n",
        "    num = random.randint(0, len(neg_index)-1)\n",
        "    if neg_index[num] in T_neg:\n",
        "      continue\n",
        "    else:\n",
        "      T_neg.append(neg_index[num])\n",
        "      new_test.append(neg_index[num])\n",
        "      i+=1\n",
        "  return new_test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Jgm4AkVDMF1y"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "pos_index = has.index\n",
        "neg_index = hasnt.index\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "D7zHRBeNMF1y"
      },
      "outputs": [],
      "source": [
        "T_pos = []\n",
        "T_neg = []\n",
        "\n",
        "test_positive = list_of_pos_test(T_pos)\n",
        "test_negative = list_of_neg_test(T_neg)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "f1cjtU9qMF1y"
      },
      "source": [
        "The information of diseases are collected using [DisGeNet](https://www.disgenet.org)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "KVv8a7XSMF1z"
      },
      "outputs": [],
      "source": [
        "\n",
        "\n",
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jzmku-cIMF1z"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "fA-zi0V_MF1z"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "# target_name = target.columns\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "YIwiOXHjMF1z"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_vPcUnrlMF11"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PH27XafOMF11"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "eTI8_dpNMF12"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "2vAejK9cMF12",
        "outputId": "52805eeb-afb0-4b10-d7c4-57c17344a844"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "748\n",
            "674 74\n",
            "The number of  known drug disease associations without positive test set: (674, 2)\n"
          ]
        }
      ],
      "source": [
        "# to make the positive test set, every time we only change the name of testPi, 1<=i<=10\n",
        "\n",
        "A_test=[]\n",
        "i=0\n",
        "print(len(A))\n",
        "\n",
        "for idx, row in has.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if idx in test_positive:   # HERE we change the number of i for  i<=i<=10\n",
        "    A.remove(text)\n",
        "    A_test.append(text)\n",
        "print(len(A), len(A_test))\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c\n",
        "\n",
        "has = has.drop(test_positive)  # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "En4MTN-gMF12",
        "outputId": "0f4f439f-3367-450a-8e83-10cceedacda9"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of unknown drug disease associations in our dataset:  (1966, 2) 64121\n",
            "The number of  known drug disease associations without positive test set: (1892, 2) 64047\n"
          ]
        }
      ],
      "source": [
        "# The negative training and test set based on testNi for 1<=i<=10\n",
        "\n",
        "print(\"The number of unknown drug disease associations in our dataset: \",(hasnt.shape), len(S))\n",
        "\n",
        "I=[]\n",
        "for idx, row in hasnt.iterrows():\n",
        "  text = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"\n",
        "  if idx in test_negative:   # HERE we change the number of i for 1<=i<=10\n",
        "    S.remove(text)\n",
        "    I.append(row)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)\n",
        "hasnt = hasnt.drop(test_negative)   # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",hasnt.shape, len(S))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mGIA9oFoMS_o"
      },
      "source": [
        "## Adding noise to train data (has and hasnt)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-lKDLRc-MjW1"
      },
      "outputs": [],
      "source": [
        "# 10% by chance -> 67 pos pair and 189 neg pair pair \n",
        "i = 0\n",
        "while i != 67:\n",
        "  disease = random.choice(my_disease_list)\n",
        "  drug = random.choice(my_drug_list)\n",
        "  if ((has['drug_id'] == drug) & (has['ind_id'] == disease)).any() or ((hasnt['drug_id'] == drug) & (hasnt['ind_id'] == disease)).any(): # it is necessary the pair was neither in pos nor in neg\n",
        "    continue\n",
        "  else:\n",
        "    text = str(drug)+\" has_indicated \"+str(disease)+\". \"\n",
        "    ass= ass+text\n",
        "    row = {'drug_id': drug, 'ind_id':disease}\n",
        "    has = has.append(row, ignore_index=True)\n",
        "    i+=1\n",
        "i=0\n",
        "while i != 189:\n",
        "  disease = random.choice(my_disease_list)\n",
        "  drug = random.choice(my_drug_list)\n",
        "  if ((hasnt['drug_id'] == drug) & (hasnt['ind_id'] == disease)).any() or ((has['drug_id'] == drug) & (has['ind_id'] == disease)).any():\n",
        "    continue\n",
        "  else:\n",
        "    text = str(drug)+\" has_sideeffect \"+str(disease)+\". \"\n",
        "    side = side + text\n",
        "    row = {'drug_id': drug, 'ind_id':disease}\n",
        "    hasnt = hasnt.append(row, ignore_index = True)\n",
        "    i+=1\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "sKOjYCosCBBg"
      },
      "source": [
        "## Removing pair as case lack of data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "GG_PBHBvFbB5"
      },
      "outputs": [],
      "source": [
        "T_rem_pos = []\n",
        "T_rem_neg = []"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1X9XB3tzKbFw",
        "outputId": "9185c3bf-735e-48d9-f1da-bf81187f5688"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "148"
            ]
          },
          "execution_count": 199,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "len(T_rem_pos)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "EfrfeNh9CLQ5",
        "outputId": "190cf762-6882-4ad2-e54f-563c07d889ac"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "526 74\n",
            "The number of  known drug disease associations without positive test set: (526, 2)\n",
            "The number of  known drug disease associations without positive test set: (1744, 2) 63899\n"
          ]
        }
      ],
      "source": [
        "# 10% by chance -> 67 pos pair and 189 neg pair pair \n",
        "\n",
        "\n",
        "pos_index = has.index\n",
        "neg_index = hasnt.index\n",
        "\n",
        "pos_10 = list_of_pos_test(T_rem_pos)\n",
        "neg_10 = list_of_neg_test(T_rem_neg)\n",
        "\n",
        "for idx, row in has.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if idx in pos_10:   # HERE we change the number of i for  i<=i<=10\n",
        "    A.remove(text)\n",
        "\n",
        "print(len(A), len(A_test))\n",
        "\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c\n",
        "\n",
        "has = has.drop(pos_10)  # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)\n",
        "\n",
        "\n",
        "for idx, row in hasnt.iterrows():\n",
        "  text = str(row.drug_id)+\" has_sideeffect \"+str(row.ind_id)+\". \"\n",
        "  if idx in neg_10:   # HERE we change the number of i for 1<=i<=10\n",
        "    S.remove(text)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "I=pd.DataFrame(I)\n",
        "hasnt = hasnt.drop(neg_10)   # HERE we change the number of i for 1<=i<=10\n",
        "print(\"The number of  known drug disease associations without positive test set:\",hasnt.shape, len(S))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4ocxfgkg4f73"
      },
      "source": [
        "#Word2Vec implementation\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HpG5IkfTtXcq"
      },
      "source": [
        "first, we make the file of our DDKG\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 74,
      "metadata": {
        "id": "-x6g4u2abgg6"
      },
      "outputs": [],
      "source": [
        "\n",
        "data=[]\n",
        "sets=[chemical, target, side, domain, atccode, ass, Disease]\n",
        "\n",
        "for s in sets:\n",
        "  for i in sent_tokenize(s):\n",
        "      temp = []\n",
        "      # tokenize the sentence into words\n",
        "      for j in word_tokenize(i):\n",
        "          temp.append(j.lower())\n",
        "      data.append(temp)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 75,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "YPCZWjv5hiDH",
        "outputId": "fccc8d16-d444-4c71-d227-a5cc0e966139"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "10814"
            ]
          },
          "execution_count": 75,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "word_freq = defaultdict(int)\n",
        "for sent in data:\n",
        "    for i in sent:\n",
        "        word_freq[i] += 1\n",
        "len(word_freq)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "L0gAjZPutovy"
      },
      "source": [
        "we train Word2Vec-CBOW for embedding every entity of DDKG including diseases and drugs\n",
        "\n",
        "based on trial and error, the best performance of Word2Vec on our dataset is when the length of vectors (size) is 700 and the iteration (iter) is 2000"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 83,
      "metadata": {
        "id": "5D8HsO0XdIWo"
      },
      "outputs": [],
      "source": [
        "model1 = gensim.models.Word2Vec(min_count = 1, alpha=0.001, size = 700, window = 2, iter=100, sg=0)\n",
        "model1.build_vocab(data, progress_per=10000)\n",
        "model1.train(data, total_examples=model1.corpus_count, epochs=500, report_delay=1)\n",
        "model1.init_sims(replace=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "id": "qqhNP4nj_dUD"
      },
      "outputs": [],
      "source": [
        "def mean_cal(K):\n",
        "  sum=0\n",
        "  for k in K:\n",
        "    sum= sum+k\n",
        "  return(sum/len(K))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9_O6CwblyN-E"
      },
      "source": [
        "# Implementation\n",
        "\n",
        "we consider several approaches:\n",
        "1. unbalanced dataset (1961 negativ and 700 positive)\n",
        "2. Undersampling negative data \n",
        "3. Upsampling positive data\n",
        "4. Upsampling positive data and undersampling negative data"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a-FQltnkF8pd"
      },
      "source": [
        "## Unbalanced"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "chcfRe4LWFfJ"
      },
      "outputs": [],
      "source": [
        "frames = [has, hasnt]\n",
        "f = pd.concat(frames)\n",
        "X=[]\n",
        "for idx, row in f.iterrows():\n",
        "  X.append(np.concatenate((model1[(row.drug_id).lower()], model1[(row.ind_id).lower()]), axis=None))\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DMsqdOuvWFfM"
      },
      "outputs": [],
      "source": [
        "y=np.zeros((len(X), ))\n",
        "\n",
        "for i in range(has.shape[0]):\n",
        "  y[i]=1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0PdMAKlQWFfN",
        "outputId": "1dc284ed-3dbc-4b23-d524-5355e5bcaef7"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.7659089276736335\n",
            "aupr =  0.7478085835273076\n",
            "auc =  0.7529148142196511\n",
            "aupr =  0.7146554964080194\n",
            "auc =  0.7967403391715318\n",
            "aupr =  0.7605391980885596\n",
            "auc =  0.8007843205757507\n",
            "aupr =  0.7587660417745893\n",
            "auc =  0.7444852941176471\n",
            "aupr =  0.697079536039768\n",
            "____________________\n",
            "Mean AUC: 0.7721667391516428 \n",
            " Mean aupr: 0.7357697711676489 \n",
            " Mean acc:  0.8690140845070422\n"
          ]
        }
      ],
      "source": [
        "# first time, we split dataset 5 times and average the results\n",
        "# Notice: here, we only work on trained vocabulary. and the test set is not evaluated yet\n",
        "\n",
        "sauc=[]\n",
        "sacc=[]\n",
        "spr=[]\n",
        "for i in range(5):\n",
        "  x_train, x_test, y_train, y_test = train_test_split(X, y)\n",
        "  clf = LogisticRegression(solver=\"liblinear\", max_iter=2000).fit(x_train, y_train)\n",
        "  # clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "  # clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "  # clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "  # y_hat= clf.predict_proba(x_test)[:, 1]\n",
        "  y_hat= clf.predict(x_test)\n",
        "  print(\"auc = \", roc_auc_score(y_test, y_hat))\n",
        "  sauc.append(roc_auc_score(y_test, y_hat))\n",
        "  # print(\"roc-auc:\",roc_auc_score(y_test, clf.decision_function(x_test)))\n",
        "  # precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "  precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "  print(\"aupr = \", auc(recall, precision))\n",
        "  spr.append(auc(recall, precision))\n",
        "  sacc.append(clf.score(x_test, y_test))\n",
        "  clf.score(x_test, y_test)\n",
        "print(\"____________________\\nMean AUC:\", mean_cal(sauc), \"\\n Mean aupr:\",mean_cal(spr),\"\\n Mean acc: \", mean_cal(sacc))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 703
        },
        "id": "Comcm9pO_ORB",
        "outputId": "8aaa1c0a-4c6a-4fa8-82ab-e1edcb706662"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.8253903708523097\n",
            "aupr =  0.5924984955629646\n",
            "Score =  0.6916299559471366\n",
            "_____________________\n",
            "auc =  0.9018829308227589\n",
            "aupr =  0.7664784090577431\n",
            "Score =  0.8458149779735683\n",
            "_____________________\n",
            "auc =  0.9246691226633921\n",
            "aupr =  0.8015454250759354\n",
            "Score =  0.8127753303964758\n",
            "_____________________\n",
            "auc =  0.9123754946104515\n",
            "aupr =  0.8028428591850996\n",
            "Score =  0.8612334801762115\n",
            "_____________________\n",
            "auc =  0.897680447537181\n",
            "aupr =  0.6637391179862124\n",
            "Score =  0.8127753303964758\n",
            "_____________________\n",
            "Mean AUC: 0.8923996732972187\n",
            "Mean AUPR: 0.7254208613735911\n",
            "Mean Score: 0.8048458149779737\n",
            "________________________\n"
          ]
        },
        {
          "data": {
            "image/png": "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xhu8+eab3vW8vDw+//xzVqxYwfjx4715E2qiugQ+9WXVqlUkJydz2mmnAXDdddexePFi+vcvnxjR5XJRWFhIaGgoBQUFdOvWje+++47hw4cTFRUFwKhRo3jnnXf47W9/G3B7aioXExMDGCHB0tLScpNfr7rqKu69916uv/76k7axDH9bBE8D5wBTnPVcTBrKFsX+48WUetzEOMnIgoIa2REcPXri86WXwm9/C2+/bZ1AK+S6665jwYIFFBUVsWHDBoYPHw4YDZi33nqLL774gvT0dIKDg3njjTcA87a9du1a1qxZw7x588jKygLghx9+YMaMGWzcuJH27dvzr7LZ5dXgdrtZvnw5V1xhtB03btxYKWFOu3btSExMZOvWrTUm1PGlpKSE7du306tXL++2xYsXM3bsWPr27UunTp1Yu3Ztrefx93oA559/PmlpaZWWjz76qFLZvXv30qPHCeX7hIQE9u4tL4TQvXt37r77bhITE+natStxcXFccsklpKam8tlnn5GVlUVBQQHLli1j9+7dFS8BwPDhw0lLS2PatGksWbLEa9N///vfOttTWzm3201aWhpdunTh4osv9v6OAFJTU1m9enVNt89v/A0WD1fVwSLyDYCqHnWkpVsUufkhBEsQHWKDEQkiqLHG5BcVmRSRixbBa69BUpLp/rn22sa5fhvkJHQJG5SBAweSmZnJ/Pnzucwn5rN8+XLWrl3rVRotLCyki5M0aN68ebz7rpHw2r17Nz/88AOnnnoqSUlJpKWlAeWT1FSksLCQtLQ09u7dyxlnnOFNVNNQHDlyhPYVpM3nz5/PHXfcARjnN3/+fIYMGVKtbEtd5Vyqk/A+WY4ePcrixYvZsWMH7du3Z9KkSbz++uvccMMNzJo1i0suuYTo6GjS0tKq7TH4+uuvAdM19PLLL/Pyyy83qI2+BAcHk56ezrFjx5gwYQIZGRne2EtwcDBhYWHk5uYSG1tjCvla8fdJWOoko1cAEekMeOp15SYgr9DIScREuxsvPrBmDVx3Hbz+OpSUwDffNM51LU3OFVdcwd13382UKVO821SVqVOnkp6eTnp6Ops3b2b27Nl88sknfPTRR3z55ZesX7+eM8880xvErCqpTVWUxQh27tyJqnpjBP3796/0pn78+HF27dpFcnIyKSkpfr3JR0ZGlkuck52dzccff8y0adPo1asXc+bM4e2330ZV6dSpE0d9W8BO+fj4eL+vB3VrEXTv3r3cW/yePXsqxWY++ugjkpKS6Ny5M6GhoVx99dVeye5bbrmFtWvXsnLlSjp06EDfvn39srE6/LHH33Lt27dn9OjRfPDBB+W2FxcXExERUS87AfPDrG3BxAeWYPIOPwJsBib5c2xDL0OGDNGTwZWTo8/e/4X263dIZ0w/oMs+/V4PHS86qXP5RW6u6iOPqA4ZYpbJk1U3bgzc9Sy6adOmpjZBVVWjo6NVVXX37t36t7/9TVVVV6xYoePGjdONGzdqcnKyHjx4UFVVs7KyNDMzU9977z29/PLLVVX1u+++0/DwcF2xYoXu2LFDU1JSvOeeM2eOPvjggzVeV1V13bp1mpiYqKWlperxeHTIkCH6yiuvqKqqy+XSadOm6V133aWqqh6PR8866yx97rnnvMevX79eV65cWekaCQkJWlhYqKqqzz33nE6fPr3c/pEjR+qnn36qqqpDhgzR5cuXe+vZp08f3bp1a52uVxdKS0s1KSlJt2/frsXFxTpw4EDNyMgoV+arr77S/v37a35+vno8Hr3xxht13rx5qqre72Tnzp3ar18/PXr0aMDtqancoUOHvDYUFBToiBEj9N///rf3uCNHjmi/fv2qvHZV/wvAGq3muepXi0BV3wB+CzyGmW18laourL8balzyCkyLICrKTWggNYbS0023zzvvGJG4X/zCdAlVCBJZWjcJCQncfvvt5bb179+fhx9+mEsuuYSBAwdy8cUXs3//fsaOHYvL5eKMM87gnnvu4eyzz67Xtc8880wGDhzI/PnzvQlzFi5cSJ8+fejbty8RERE8+uijQN0S6lxyySV8/vnngOkWmjBhQrn911xzjXf00Kuvvsof//hH0tLSuPDCC3nwwQfp3bt3nRP4+EtISAj/+Mc/GDNmDGeccQbXXnstKSkpgAne79u3j+HDhzNx4kQGDx7MgAED8Hg8THck3a+55hr69+/P+PHjeeqppyp1g5VRFiOouFSMEdRkj69N1ZXbv38/o0ePZuDAgQwbNoyLL7643BDkFStWMK6B5hv5m5gmsartqrqrQayoA/VJTPPwb7fz5ifduXZCISOucDM4tRudY8NrP7iu7N5t5gb06we//z04owEsgcUmpgk869at48knn+S1115ralPaPFdffTWPP/54lV1YAUlM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",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# the second times, we aplly stratifiedkfold\n",
        "\n",
        "skf = StratifiedKFold(n_splits=10)\n",
        "# skf.get_n_splits(X, y)\n",
        "score=[]\n",
        "AUC=[]\n",
        "AUPR=[]\n",
        "X= np.array(X)\n",
        "y=np.array(y)\n",
        "tprs = []\n",
        "aucs = []\n",
        "mean_fpr = np.linspace(0, 1, 100)\n",
        "fig, ax = plt.subplots()\n",
        "for train_index, test_index in skf.split(X, y):\n",
        "    #  print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
        "     x_train, x_test = X[train_index], X[test_index]\n",
        "     y_train, y_test = y[train_index], y[test_index]\n",
        "     clf = LogisticRegression(solver=\"liblinear\", class_weight = 'balanced').fit(x_train, y_train)\n",
        "    #  clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "    #  clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "    #  clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "     viz = plot_roc_curve(clf, x_test, y_test,\n",
        "                         name='ROC fold {}'.format(i),\n",
        "                         alpha=0.3, lw=1, ax=ax)\n",
        "     interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)\n",
        "     interp_tpr[0] = 0.0\n",
        "     tprs.append(interp_tpr)\n",
        "     aucs.append(viz.roc_auc)\n",
        "     y_hat= clf.predict_proba(x_test)[:,1]\n",
        "    #  y_hat= clf.predict(x_test)\n",
        "     A = roc_auc_score(y_test, y_hat)\n",
        "    #  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "     AUC.append(A)\n",
        "     print(\"auc = \", A)\n",
        "     precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "    #  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "     PR = auc(recall, precision)\n",
        "     AUPR.append(PR)\n",
        "     print(\"aupr = \", PR)\n",
        "     sc= clf.score(x_test, y_test)\n",
        "     score.append(sc)\n",
        "     print(\"Score = \", sc)\n",
        "     print(\"_____________________\")\n",
        "\n",
        "print(\"Mean AUC:\",mean_cal(AUC))\n",
        "print(\"Mean AUPR:\",mean_cal(AUPR))\n",
        "print(\"Mean Score:\",mean_cal(score))\n",
        "print(\"________________________\")\n",
        "\n",
        "\n",
        "ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',\n",
        "        label='Chance', alpha=.8)\n",
        "\n",
        "mean_tpr = np.mean(tprs, axis=0)\n",
        "mean_tpr[-1] = 1.0\n",
        "mean_auc = auc(mean_fpr, mean_tpr)\n",
        "std_auc = np.std(aucs)\n",
        "ax.plot(mean_fpr, mean_tpr, color='b',\n",
        "        label=r'Mean ROC (AUC = %0.2f $\\pm$ %0.2f)' % (mean_auc, std_auc),\n",
        "        lw=2, alpha=.8)\n",
        "\n",
        "std_tpr = np.std(tprs, axis=0)\n",
        "tprs_upper = np.minimum(mean_tpr + std_tpr, 1)\n",
        "tprs_lower = np.maximum(mean_tpr - std_tpr, 0)\n",
        "ax.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,\n",
        "                label=r'$\\pm$ 1 std. dev.')\n",
        "\n",
        "ax.set(xlim=[-0.05, 1.05], ylim=[-0.05, 1.05],\n",
        "       title=\"Receiver operating characteristic example\")\n",
        "ax.legend(loc=\"lower right\")\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "vAl7UBg0_Q1A",
        "outputId": "aac9a0dd-f2e0-4df5-bfb0-a7e435942623"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc-roc =  0.9352091817845243\n",
            "auc-pr =  0.936038966900987\n",
            "0.9364976051007621\n",
            "Acc =  0.8435374149659864\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.88      0.79      0.83        73\n",
            "           1       0.81      0.89      0.85        74\n",
            "\n",
            "    accuracy                           0.84       147\n",
            "   macro avg       0.85      0.84      0.84       147\n",
            "weighted avg       0.85      0.84      0.84       147\n",
            "\n"
          ]
        }
      ],
      "source": [
        "# the main test set\n",
        "X_me = []\n",
        "Y_me = []\n",
        "for a in A_test:\n",
        "  sample = a.split(\" \")\n",
        "  dname =sample[0]\n",
        "  disname = sample[2].split(\".\")\n",
        "  X_me.append(np.concatenate((model1[(dname.rstrip().lower())], model1[(disname[0].lstrip().lower())]), axis=None))\n",
        "  Y_me.append(1)\n",
        "for idx, i in I.iterrows():\n",
        "  if(i.ind_id in my_disease_list and i.drug_id in my_drug_list):\n",
        "    X_me.append(np.concatenate((model1[i.drug_id.lower()], model1[i.ind_id.lower()]), axis=None))\n",
        "    # X_me.append((model1[i.drug_id.lower()]- model1[i.ind_id.lower()]))\n",
        "    Y_me.append(0)\n",
        "\n",
        "# trainng the model on the train set and evaluate on the test set\n",
        "\n",
        "\n",
        "clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000, penalty='l2').fit(X, y) \n",
        "# clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(X, y)\n",
        "# clf = DecisionTreeClassifier().fit(X, y)\n",
        "# clf = RandomForestClassifier().fit(X, y)\n",
        "\n",
        "y_hat = clf.predict_proba(X_me)[:,1]\n",
        "A = roc_auc_score(Y_me, y_hat)\n",
        "\n",
        "#  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "print(\"auc-roc = \", A)\n",
        "precision, recall, thresholds = precision_recall_curve(Y_me, y_hat)\n",
        "\n",
        "#  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "PR = auc(recall, precision)\n",
        "\n",
        "print(\"auc-pr = \", PR)\n",
        "print(average_precision_score(Y_me, clf.predict_proba(X_me)[:,1]))\n",
        "sc= clf.score(X_me, Y_me)\n",
        "\n",
        "print(\"Acc = \", sc)\n",
        "print(classification_report(Y_me, clf.predict(X_me)))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "P7l7mXgEGB1x"
      },
      "source": [
        "## Undersampling negative data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hUFEJSBH_TtN"
      },
      "outputs": [],
      "source": [
        "neg =hasnt.copy()\n",
        "neg = neg.sample(n = has.shape[0]) #undersampling negative data randomly for training the model\n",
        "frames = [has, neg]\n",
        "\n",
        "f = pd.concat(frames)\n",
        "X=[]\n",
        "for idx, row in f.iterrows():\n",
        "  X.append(np.concatenate((model1[(row.drug_id).lower()], model1[(row.ind_id).lower()]), axis=None))\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3k08ZYeU_VlY"
      },
      "outputs": [],
      "source": [
        "y=np.zeros((len(X), ))\n",
        "\n",
        "for i in range(has.shape[0]):\n",
        "  y[i]=1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "h39QApRoj0pd",
        "outputId": "60ffa04e-3d34-4a51-fd71-e81c60501b72"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.8491529357159433\n",
            "aupr =  0.8982277388839807\n",
            "auc =  0.8509032634032634\n",
            "aupr =  0.9011913353074388\n",
            "auc =  0.8366666666666667\n",
            "aupr =  0.8863188283340374\n",
            "auc =  0.8437934228809634\n",
            "aupr =  0.8778817096532135\n",
            "auc =  0.834073641145529\n",
            "aupr =  0.8940810547239494\n",
            "____________________\n",
            "Mean AUC: 0.8429179859624731 \n",
            " Mean aupr: 0.8915401333805241 \n",
            " Mean acc:  0.8425855513307985\n"
          ]
        }
      ],
      "source": [
        "\n",
        "sauc=[]\n",
        "sacc=[]\n",
        "spr=[]\n",
        "for i in range(5):\n",
        "  x_train, x_test, y_train, y_test = train_test_split(X, y)\n",
        "  clf = LogisticRegression(solver=\"liblinear\", max_iter=2000).fit(x_train, y_train)\n",
        "  # clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "  # clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "  # clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "  # y_hat= clf.predict_proba(x_test)[:, 1]\n",
        "  y_hat= clf.predict(x_test)\n",
        "  print(\"auc = \", roc_auc_score(y_test, y_hat))\n",
        "  sauc.append(roc_auc_score(y_test, y_hat))\n",
        "  # print(\"roc-auc:\",roc_auc_score(y_test, clf.decision_function(x_test)))\n",
        "  # precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "  precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "  print(\"aupr = \", auc(recall, precision))\n",
        "  spr.append(auc(recall, precision))\n",
        "  sacc.append(clf.score(x_test, y_test))\n",
        "  clf.score(x_test, y_test)\n",
        "print(\"____________________\\nMean AUC:\", mean_cal(sauc), \"\\n Mean aupr:\",mean_cal(spr),\"\\n Mean acc: \", mean_cal(sacc))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 703
        },
        "id": "hfMSq6wwlqTq",
        "outputId": "acd1f1a7-6a57-46c5-a30c-04866177ac8a"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.8758760107816711\n",
            "aupr =  0.866860089863027\n",
            "Score =  0.8009478672985783\n",
            "_____________________\n",
            "auc =  0.8899820305480683\n",
            "aupr =  0.8945004969194819\n",
            "Score =  0.8056872037914692\n",
            "_____________________\n",
            "auc =  0.929750566893424\n",
            "aupr =  0.9219523392368678\n",
            "Score =  0.8904761904761904\n",
            "_____________________\n",
            "auc =  0.8738775510204081\n",
            "aupr =  0.879991865806351\n",
            "Score =  0.7952380952380952\n",
            "_____________________\n",
            "auc =  0.9260317460317461\n",
            "aupr =  0.9108765045670141\n",
            "Score =  0.8666666666666667\n",
            "_____________________\n",
            "Mean Score: 0.8318032046941999\n",
            "Mean AUC: 0.8991035810550635\n",
            "Mean AUPR: 0.8948362592785484\n",
            "________________________\n"
          ]
        },
        {
          "data": {
            "image/png": "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GrVixQqOOOII5s6dy7x58/jf/1QV3hdffJEbb7xxr2QbCfRmQGwdX2aiXoM7f3piBzAuZXmssy6VSuB5KWVSSrkZWIdSDENGOBzuUIoSYOdmdalTp5q4XO3lJceNG6dTSWvaCAQCrFixglWrVpGfn89996lkvdFolNNPP53rr7+etWvX8uGHH/L2229z//33A7Bq1SoWLlzIH//4R9asWcOyZcuYnKYU5AcffAC2zYqnn+aCBQuU/b+0FCoq9rpgjGVZfO973+Okk07qts3vf/97zj777A75shYvXsz8+fP585//3OdzXXXVVeTn57N+/XqWL1/OI4880tYh7ykvv/wy69evZ/369Tz00EN89atf7dLGNE2++c1v8sYbb/DRRx8xZ84c7r33XgC++93vsmjRIlasWMHNN9/Md7/7XQBOPfVUXnjhBSKRyF7JN9zpURFIKX/j/P1xuk8vx34PmCKEmOiUtbwQeL5Tm7+iRgMIIQpRpqJNe3Ad+4REzKS6soFEGELRCDWxGnZHd7Ntk+rsW4vPJE2Tgvx8fNFqaNgC4aqhElkzTDnyyCPZsUO99zz55JN8+tOfbutkMzIyuPfee7njDuVE97Of/Ywf/vCHTJ8+HVAji84dWXV1NRdffDHvLV/O3DPPZGNdHUu3bOHg449n9pw5XHHFFcTjHZMkAjzyyCNMnTqVww47jLfeeqtbeX/9619zzjnnUFzcvb/GE088wRlnnNG2vHHjRsLhMLfeeiuLFy/u0++yceNG3n33XW699dY20+vEiRM59dRT+7R/dzz33HNceumlCCE44ogjaGxsZNeuXR3aSCmRUtLS0qIyAzc3M8ZJsieEoLm5GYCmpqYO6xcsWMCLL764V/INd/qTa+hWIAq8AswBviWl/GN3+0gpTSHEQuDvKPv/76WUq4UQNwPLpJTPO9tOEkKsASzgO1LKur26or2goTpEtNnEneulkXoQCWwzQN3WcRgYbYpASonfI2DHx5BTrnbOGTtUYmvS8I81+145nzCjpE/tLMti6dKlXHnllYAyCx166KEd2kyaNIlwOExzczOrVq1KawoClB9zYyPFBQX89re/5Re/+AUv/vWvxJJJFkydytKlS5k6dSqXXnopDzzwANdee23brrt27WLRokUsX76cnJwcjj32WA4++OAup9ixYwd/+ctfeOONN3jvvffS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ahYj2LPHyEN45kd8/jkMG1a1NlkslqChGj0NA0+6EyOIjHSRP/1yFeF2w7vvwqhRxgk0bmykIYYOrWrLLKeJiHDTTTd51/Py8mjevHnAE9OEhoaSmJhIfHw8w4cP59ixY959e/bs4aqrriI2NpZOnToxYcIEcnJyvPuLSqazdevWQtfIzMxk4MCBuFwu77aFCxciIvz444/ebampqcTHx+c79oknnuDvf/97ma5XVj799FO6dOlCTEwMzz77bJFlXnzxReLj44mLi2PatGllPj4QNhVXZvfu3Vx44YV069aNuLg4XnzxRQBycnIYMGBAifpTZSVoHEFWnpsdh1ykZ7vIkTxCQqrYEezYAb/7HbzwAmRnw+WXG3mIyy47FSOw1Djq1q3rlZQG+Pzzz2nVqiT19YohKiqKpKQkkpOTadKkCTNmzACMIN0111zD1VdfzU8//cTWrVs5efKkV6a6LMl0Zs+ezTXXXEOoz7yVOXPm0L9/f+bMmVOofFEEKnmPy+Vi3Lhx/Oc//yElJYU5c+aQkpKSr0xycjKvvfYaq1atYsOGDSxevJht27b5fbwvK1as4NZbby23TSWVCQsL47nnniMlJYXvvvuOGTNmkJKSQp06dbj44ouZN2/eadypovE3Z7E4uYofc9bbikjfCrOiEsjJc5OZHUZkeAhnNRHOahRVtQb9+CNs3mzkoadNg6eesiJxFURJeWbK8/GXoUOH8sknnwDmQXnDDTd4973zzjv07duXxMRE7r77bu/b9dVXX02vXr2Ii4vzitalpqbStWtX7rzzTuLi4rjsssu8DqYkzj33XPbuNfM+v/jiCyIjI/nd734HmJbDCy+8wOzZs8nIyCgxmU5B3n33Xa666lRuqZMnT/L111/z+uuvM3fuXL/uTVmuVxZWrVpFTEwMHTt2pE6dOowePZqPP/44X5kffviBfv36ER0dTVhYGAMHDuRDJ0mRP8cHwqaSypx11ln0dCaN1q9fn65du3q/16uvvpp33323XPb54m+L4GXgXMDziz6BSUNZo8jOCUeABnWV8KqYjXv06Knlyy+HBx+E99+H/v2LP8ZS4xg9ejRz584lKyuLjRs30q9fP8A8iObNm8c333xDUlISoaGh3n/m2bNns3btWtasWcP06dM5cuQIAD/99BPjxo1j8+bNNGrUiA88M8uLweVysWzZMq68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",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "\n",
        "skf = StratifiedKFold(n_splits=10)\n",
        "# skf.get_n_splits(X, y)\n",
        "score=[]\n",
        "AUC=[]\n",
        "AUPR=[] \n",
        "X= np.array(X)\n",
        "y=np.array(y)\n",
        "tprs = []\n",
        "aucs = []\n",
        "mean_fpr = np.linspace(0, 1, 100)\n",
        "fig, ax = plt.subplots()\n",
        "for train_index, test_index in skf.split(X, y):\n",
        "    #  print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
        "     x_train, x_test = X[train_index], X[test_index]\n",
        "     y_train, y_test = y[train_index], y[test_index]\n",
        "     clf = LogisticRegression(solver=\"liblinear\", class_weight = 'balanced').fit(x_train, y_train)\n",
        "    #  clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "    #  clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "    #  clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "     viz = plot_roc_curve(clf, x_test, y_test,\n",
        "                         name='ROC fold {}'.format(i),\n",
        "                         alpha=0.3, lw=1, ax=ax)\n",
        "     interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)\n",
        "     interp_tpr[0] = 0.0\n",
        "     tprs.append(interp_tpr)\n",
        "     aucs.append(viz.roc_auc)\n",
        "     y_hat= clf.predict_proba(x_test)[:,1]\n",
        "    #  y_hat= clf.predict(x_test)\n",
        "     A = roc_auc_score(y_test, y_hat)\n",
        "    #  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "     AUC.append(A)\n",
        "     print(\"auc = \", A)\n",
        "     precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "    #  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "     PR = auc(recall, precision)\n",
        "     AUPR.append(PR)\n",
        "     print(\"aupr = \", PR)\n",
        "     sc= clf.score(x_test, y_test)\n",
        "     score.append(sc)\n",
        "     print(\"Score = \", sc)\n",
        "     print(\"_____________________\")\n",
        "print(\"Mean Score:\",mean_cal(score))\n",
        "print(\"Mean AUC:\",mean_cal(AUC))\n",
        "print(\"Mean AUPR:\",mean_cal(AUPR))\n",
        "print(\"________________________\")\n",
        "\n",
        "\n",
        "ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',\n",
        "        label='Chance', alpha=.8)\n",
        "\n",
        "mean_tpr = np.mean(tprs, axis=0)\n",
        "mean_tpr[-1] = 1.0\n",
        "mean_auc = auc(mean_fpr, mean_tpr)\n",
        "std_auc = np.std(aucs)\n",
        "ax.plot(mean_fpr, mean_tpr, color='b',\n",
        "        label=r'Mean ROC (AUC = %0.2f $\\pm$ %0.2f)' % (mean_auc, std_auc),\n",
        "        lw=2, alpha=.8)\n",
        "\n",
        "std_tpr = np.std(tprs, axis=0)\n",
        "tprs_upper = np.minimum(mean_tpr + std_tpr, 1)\n",
        "tprs_lower = np.maximum(mean_tpr - std_tpr, 0)\n",
        "ax.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,\n",
        "                label=r'$\\pm$ 1 std. dev.')\n",
        "\n",
        "ax.set(xlim=[-0.05, 1.05], ylim=[-0.05, 1.05],\n",
        "       title=\"Receiver operating characteristic example\")\n",
        "ax.legend(loc=\"lower right\")\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cLe8bNKy4HVM",
        "outputId": "6fae4ffc-f9ce-4e9b-9512-0f9d789bc567"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc-roc =  0.9324324324324325\n",
            "auc-pr =  0.9354848803931286\n",
            "0.9359336856096917\n",
            "Acc =  0.8435374149659864\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.85      0.84      0.84        73\n",
            "           1       0.84      0.85      0.85        74\n",
            "\n",
            "    accuracy                           0.84       147\n",
            "   macro avg       0.84      0.84      0.84       147\n",
            "weighted avg       0.84      0.84      0.84       147\n",
            "\n"
          ]
        }
      ],
      "source": [
        "# the main test set\n",
        "X_me = []\n",
        "Y_me = []\n",
        "for a in A_test:\n",
        "  sample = a.split(\" \")\n",
        "  dname =sample[0]\n",
        "  disname = sample[2].split(\".\")\n",
        "  X_me.append(np.concatenate((model1[(dname.rstrip().lower())], model1[(disname[0].lstrip().lower())]), axis=None))\n",
        "  Y_me.append(1)\n",
        "for idx, i in I.iterrows():\n",
        "  if(i.ind_id in my_disease_list and i.drug_id in my_drug_list):\n",
        "    X_me.append(np.concatenate((model1[i.drug_id.lower()], model1[i.ind_id.lower()]), axis=None))\n",
        "    # X_me.append((model1[i.drug_id.lower()]- model1[i.ind_id.lower()]))\n",
        "    Y_me.append(0)\n",
        "\n",
        "# trainng the model on the train set and evaluate on the test set\n",
        "\n",
        "\n",
        "clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000, penalty='l2').fit(X, y) \n",
        "# clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(X, y)\n",
        "# clf = DecisionTreeClassifier().fit(X, y)\n",
        "# clf = RandomForestClassifier().fit(X, y)\n",
        "\n",
        "y_hat = clf.predict_proba(X_me)[:,1]\n",
        "A = roc_auc_score(Y_me, y_hat)\n",
        "\n",
        "#  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "print(\"auc-roc = \", A)\n",
        "precision, recall, thresholds = precision_recall_curve(Y_me, y_hat)\n",
        "\n",
        "#  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "PR = auc(recall, precision)\n",
        "\n",
        "print(\"auc-pr = \", PR)\n",
        "print(average_precision_score(Y_me, clf.predict_proba(X_me)[:,1]))\n",
        "sc= clf.score(X_me, Y_me)\n",
        "\n",
        "print(\"Acc = \", sc)\n",
        "print(classification_report(Y_me, clf.predict(X_me)))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "htEeiKjGBxLC"
      },
      "source": [
        "## Upsampling positive data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-L_foREultnS"
      },
      "outputs": [],
      "source": [
        "\n",
        "frames = [has, hasnt]\n",
        "\n",
        "f = pd.concat(frames)\n",
        "X=[]\n",
        "for idx, row in f.iterrows():\n",
        "  X.append(np.concatenate((model1[(row.drug_id).lower()], model1[(row.ind_id).lower()]), axis=None))\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "dmDjEzh8CFOV"
      },
      "outputs": [],
      "source": [
        "y=np.zeros((len(X), ))\n",
        "\n",
        "for i in range(has.shape[0]):\n",
        "  y[i]=1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "8TA_K9MjFMqG"
      },
      "outputs": [],
      "source": [
        "from imblearn.over_sampling import SMOTE, RandomOverSampler\n",
        "oversample = SMOTE() # over sampling positive by SMOTE\n",
        "# oversample = RandomOverSampler()\n",
        "X, y = oversample.fit_resample(X, y)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "oj9TbC0J_ZtA",
        "outputId": "0251599f-39c8-4339-df5b-c584174a96b7"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.9279590096633612\n",
            "aupr =  0.9141471434864855\n",
            "auc =  0.9376749153041686\n",
            "aupr =  0.9186746582811575\n",
            "auc =  0.9199455325617114\n",
            "aupr =  0.9036407982878085\n",
            "auc =  0.9213555256291558\n",
            "aupr =  0.9096032360960854\n",
            "auc =  0.9229162721208678\n",
            "aupr =  0.9032302571344832\n",
            "____________________\n",
            "Mean AUC: 0.925970251055853 \n",
            " Mean aupr: 0.9098592186572041 \n",
            " Mean acc:  0.851605504587156\n"
          ]
        }
      ],
      "source": [
        "\n",
        "\n",
        "sauc=[]\n",
        "sacc=[]\n",
        "spr=[]\n",
        "for i in range(5):\n",
        "  \n",
        "  x_train, x_test, y_train, y_test = train_test_split(X, y)\n",
        "  clf = LogisticRegression(solver=\"liblinear\", max_iter=2000).fit(x_train, y_train)\n",
        "  # clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "  # clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "  # clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "  y_hat= clf.predict_proba(x_test)[:, 1]\n",
        "  # y_hat= clf.predict(x_test)\n",
        "  print(\"auc = \", roc_auc_score(y_test, y_hat))\n",
        "  sauc.append(roc_auc_score(y_test, y_hat))\n",
        "  # print(\"roc-auc:\",roc_auc_score(y_test, clf.decision_function(x_test)))\n",
        "  # precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "  precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "  print(\"aupr = \", auc(recall, precision))\n",
        "  spr.append(auc(recall, precision))\n",
        "  sacc.append(clf.score(x_test, y_test))\n",
        "  clf.score(x_test, y_test)\n",
        "print(\"____________________\\nMean AUC:\", mean_cal(sauc), \"\\n Mean aupr:\",mean_cal(spr),\"\\n Mean acc: \", mean_cal(sacc))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 703
        },
        "id": "ZfgUBnNrOHEs",
        "outputId": "b7c0fae5-cbe3-4fdc-cee5-686e8d80d240"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.8535480004269258\n",
            "aupr =  0.8391709603771755\n",
            "Score =  0.7478510028653295\n",
            "_____________________\n",
            "auc =  0.9364208832439799\n",
            "aupr =  0.9328806605582934\n",
            "Score =  0.8624641833810889\n",
            "_____________________\n",
            "auc =  0.9094506613246196\n",
            "aupr =  0.8965433925056219\n",
            "Score =  0.8237822349570201\n",
            "_____________________\n",
            "auc =  0.9511082567598722\n",
            "aupr =  0.9500114993511588\n",
            "Score =  0.8751793400286944\n",
            "_____________________\n",
            "auc =  0.9148305503408753\n",
            "aupr =  0.8807233908703942\n",
            "Score =  0.8493543758967002\n",
            "_____________________\n",
            "Mean Score: 0.8317262274257665\n",
            "Mean AUC: 0.9130716704192545\n",
            "Mean AUPR: 0.8998659807325288\n",
            "________________________\n"
          ]
        },
        {
          "data": {
            "image/png": "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VfW7YOID8zF5h/8IbAauDeTYql769Omjp8sfx63TlO5H9MZHl+sXizad9nkCIitL9Y9/VO3TxyyjR6tu3Bjca4YwmzYF+fsMkLi4OFVV3blzp77yyiuqqrpkyRIdMWKEbty4URMTE3X//v2qqnr48GHNyMjQuXPn6mWXXaaqqt9//71GRUXpkiVLdPv27ZqUlOQ996RJk/Spp54q97qqqmvXrtWEhAQtKChQt9utffr00ffee09VVQsLC/W2227TBx54QFVV3W63nnPOOfrmm296j1+3bp0uW7asxDXi4+M1NzdXVVXffPNNveOOO4rsHzRokH711VeqqtqnTx9dvHixt55dunTRrVu3Vuh6FaGgoEA7duyo27Zt07y8PE1JSdH09PQS5Tz3fseOHdqtWzc9cuRIkf3F73mwbSqvzIEDB7z25eTk6MCBA/Xf//63qqoeOnRIu3XrVua1S/s9AKu1jOdqQDECVZ0OPAz8CTPb+EpVnV01rqj6yHaGjzaIzicimLOK09JMt8/HHxuRuN/+1nQJ+QSJLPWb+Ph47r333iLbevTowXPPPccll1xCSkoKF198MXv37mXYsGEUFhbSvXt3HnnkEX75y19W6tpnn302KSkpzJgxw5ssZ/bs2XTp0oWuXbsSHR3N888/D1Qsmc4ll1zCf//7X8B0C40aNarI/quvvto7euj999/nD3/4A6mpqVxwwQU89dRTdO7cucLJewIlIiKCv//97wwdOpTu3btz3XXXkZSUBJjg/Z49e7w29ujRg5EjRzJlypQi3V1jxozh3HPPZfPmzcTHx/POO++UuI4nRlB8KS1GEIhN5ZXZu3cv559/PikpKfTr14+LL77YOwx5yZIljKjCuUaBJqZJKG27qv5cZZYESGUS09x79WaWbjqDgVd+xw3DOjBgcJC6aHbuNHMDunWDJ54AZ0SAJXjYxDTBZ+3atbz00kt88MEHNW1KyHPVVVfxwgsv0LVr11L3ByUxDbAQEx8QIBroiOkeSgrw+FrBidwIctwniYlycUbXJlV3YlX49lvo398Egdu3N3mEu3WzInGWekPv3r05//zzcblctVu1t56Tn5/PlVdeWaYTOB0C7Rrqqaopzt8umOT1K6rMimoiO9d0DSU0OZOwqppMtn8//L//B3ffDf/+96nt3btbJ2Cpd4wbN846gRqmQYMG3Hzz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",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "skf = StratifiedKFold(n_splits=10)\n",
        "# skf.get_n_splits(X, y)\n",
        "score=[]\n",
        "AUC=[]\n",
        "AUPR=[]\n",
        "X= np.array(X)\n",
        "y=np.array(y)\n",
        "tprs = []\n",
        "aucs = []\n",
        "mean_fpr = np.linspace(0, 1, 100)\n",
        "fig, ax = plt.subplots()\n",
        "for train_index, test_index in skf.split(X, y):\n",
        "    #  print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
        "     x_train, x_test = X[train_index], X[test_index]\n",
        "     y_train, y_test = y[train_index], y[test_index]\n",
        "     clf = LogisticRegression(solver=\"liblinear\", class_weight = 'balanced').fit(x_train, y_train)\n",
        "    #  clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "    #  clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "    #  clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "     viz = plot_roc_curve(clf, x_test, y_test,\n",
        "                         name='ROC fold {}'.format(i),\n",
        "                         alpha=0.3, lw=1, ax=ax)\n",
        "     interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)\n",
        "     interp_tpr[0] = 0.0\n",
        "     tprs.append(interp_tpr)\n",
        "     aucs.append(viz.roc_auc)\n",
        "     y_hat= clf.predict_proba(x_test)[:,1]\n",
        "    #  y_hat= clf.predict(x_test)\n",
        "     A = roc_auc_score(y_test, y_hat)\n",
        "    #  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "     AUC.append(A)\n",
        "     print(\"auc = \", A)\n",
        "     precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "    #  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "     PR = auc(recall, precision)\n",
        "     AUPR.append(PR)\n",
        "     print(\"aupr = \", PR)\n",
        "     sc= clf.score(x_test, y_test)\n",
        "     score.append(sc)\n",
        "     print(\"Score = \", sc)\n",
        "     print(\"_____________________\")\n",
        "print(\"Mean Score:\",mean_cal(score))\n",
        "print(\"Mean AUC:\",mean_cal(AUC))\n",
        "print(\"Mean AUPR:\",mean_cal(AUPR))\n",
        "print(\"________________________\")\n",
        "\n",
        "\n",
        "ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',\n",
        "        label='Chance', alpha=.8)\n",
        "\n",
        "mean_tpr = np.mean(tprs, axis=0)\n",
        "mean_tpr[-1] = 1.0\n",
        "mean_auc = auc(mean_fpr, mean_tpr)\n",
        "std_auc = np.std(aucs)\n",
        "ax.plot(mean_fpr, mean_tpr, color='b',\n",
        "        label=r'Mean ROC (AUC = %0.2f $\\pm$ %0.2f)' % (mean_auc, std_auc),\n",
        "        lw=2, alpha=.8)\n",
        "\n",
        "std_tpr = np.std(tprs, axis=0)\n",
        "tprs_upper = np.minimum(mean_tpr + std_tpr, 1)\n",
        "tprs_lower = np.maximum(mean_tpr - std_tpr, 0)\n",
        "ax.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,\n",
        "                label=r'$\\pm$ 1 std. dev.')\n",
        "\n",
        "ax.set(xlim=[-0.05, 1.05], ylim=[-0.05, 1.05],\n",
        "       title=\"Receiver operating characteristic example\")\n",
        "ax.legend(loc=\"lower right\")\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "3mjpMparOJET",
        "outputId": "cdc2b425-c0cd-4db0-cf63-f0a93f7fdf84"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc-roc =  0.9353942984079971\n",
            "auc-pr =  0.9356810665636106\n",
            "0.9361494874827805\n",
            "Acc =  0.8503401360544217\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.87      0.82      0.85        73\n",
            "           1       0.83      0.88      0.86        74\n",
            "\n",
            "    accuracy                           0.85       147\n",
            "   macro avg       0.85      0.85      0.85       147\n",
            "weighted avg       0.85      0.85      0.85       147\n",
            "\n"
          ]
        }
      ],
      "source": [
        "# the main test set\n",
        "X_me = []\n",
        "Y_me = []\n",
        "for a in A_test:\n",
        "  sample = a.split(\" \")\n",
        "  dname =sample[0]\n",
        "  disname = sample[2].split(\".\")\n",
        "  X_me.append(np.concatenate((model1[(dname.rstrip().lower())], model1[(disname[0].lstrip().lower())]), axis=None))\n",
        "  Y_me.append(1)\n",
        "for idx, i in I.iterrows():\n",
        "  if(i.ind_id in my_disease_list and i.drug_id in my_drug_list):\n",
        "    X_me.append(np.concatenate((model1[i.drug_id.lower()], model1[i.ind_id.lower()]), axis=None))\n",
        "    # X_me.append((model1[i.drug_id.lower()]- model1[i.ind_id.lower()]))\n",
        "    Y_me.append(0)\n",
        "\n",
        "# trainng the model on the train set and evaluate on the test set\n",
        "\n",
        "\n",
        "clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000, penalty='l2').fit(X, y) \n",
        "# clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(X, y)\n",
        "# clf = DecisionTreeClassifier().fit(X, y)\n",
        "# clf = RandomForestClassifier().fit(X, y)\n",
        "\n",
        "y_hat = clf.predict_proba(X_me)[:,1]\n",
        "A = roc_auc_score(Y_me, y_hat)\n",
        "\n",
        "#  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "print(\"auc-roc = \", A)\n",
        "precision, recall, thresholds = precision_recall_curve(Y_me, y_hat)\n",
        "\n",
        "#  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "PR = auc(recall, precision)\n",
        "\n",
        "print(\"auc-pr = \", PR)\n",
        "print(average_precision_score(Y_me, clf.predict_proba(X_me)[:,1]))\n",
        "sc= clf.score(X_me, Y_me)\n",
        "\n",
        "print(\"Acc = \", sc)\n",
        "print(classification_report(Y_me, clf.predict(X_me)))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "D1GhuQZ-I5-F"
      },
      "source": [
        "## First oversample, Next Undersample"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 84,
      "metadata": {
        "id": "n832QIPGOOyP"
      },
      "outputs": [],
      "source": [
        "\n",
        "frames = [has, hasnt]\n",
        "\n",
        "f = pd.concat(frames)\n",
        "X=[]\n",
        "for idx, row in f.iterrows():\n",
        "  X.append(np.concatenate((model1[(row.drug_id).lower()], model1[(row.ind_id).lower()]), axis=None))\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 85,
      "metadata": {
        "id": "ffW9o3lGOSG6"
      },
      "outputs": [],
      "source": [
        "y=np.zeros((len(X), ))\n",
        "\n",
        "for i in range(has.shape[0]):\n",
        "  y[i]=1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 86,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "9tiYsbe1_gJA",
        "outputId": "9c9aa0d6-bd9f-4b56-8d48-81bdc801e221"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "3587\n",
            "3398\n"
          ]
        }
      ],
      "source": [
        "from imblearn.over_sampling import SMOTE, RandomOverSampler\n",
        "from imblearn.under_sampling import RandomUnderSampler\n",
        "over = SMOTE(0.9)\n",
        "# over = RandomOverSampler(0.9)\n",
        "under = RandomUnderSampler()\n",
        "X, y = over.fit_resample(X,y)\n",
        "print(len(X))\n",
        "X,y = under.fit_resample(X,y)\n",
        "print(len(X))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 87,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "iGpCZXyFOU_b",
        "outputId": "1d664696-9636-46dc-9321-5d9c3cf9ff81"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.931541019955654\n",
            "aupr =  0.9217092175614312\n",
            "auc =  0.9278825647417255\n",
            "aupr =  0.9175124484995066\n",
            "auc =  0.9218196925633568\n",
            "aupr =  0.9034441427593656\n",
            "auc =  0.926346817670558\n",
            "aupr =  0.9230102027015479\n",
            "auc =  0.9172396802196828\n",
            "aupr =  0.9137503442962187\n",
            "____________________\n",
            "Mean AUC: 0.9249659550301954 \n",
            " Mean aupr: 0.915885271163614 \n",
            " Mean acc:  0.8510588235294116\n"
          ]
        }
      ],
      "source": [
        "sauc=[]\n",
        "sacc=[]\n",
        "spr=[]\n",
        "for i in range(5):\n",
        "  x_train, x_test, y_train, y_test = train_test_split(X, y)\n",
        "  clf = LogisticRegression(solver=\"sag\", max_iter=2000).fit(x_train, y_train)\n",
        "  # clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "  # clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "  # clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "  y_hat= clf.predict_proba(x_test)[:, 1]\n",
        "  # y_hat= clf.predict(x_test)\n",
        "  print(\"auc = \", roc_auc_score(y_test, y_hat))\n",
        "  sauc.append(roc_auc_score(y_test, y_hat))\n",
        "  # print(\"roc-auc:\",roc_auc_score(y_test, clf.decision_function(x_test)))\n",
        "  # precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "  precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "  print(\"aupr = \", auc(recall, precision))\n",
        "  spr.append(auc(recall, precision))\n",
        "  sacc.append(clf.score(x_test, y_test))\n",
        "  clf.score(x_test, y_test)\n",
        "print(\"____________________\\nMean AUC:\", mean_cal(sauc), \"\\n Mean aupr:\",mean_cal(spr),\"\\n Mean acc: \", mean_cal(sacc))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 88,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "tTffoU4NOXy2",
        "outputId": "e917b999-8793-4243-a734-2a480dcb3132"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.8883910034602076\n",
            "aupr =  0.8619294219806679\n",
            "Score =  0.8147058823529412\n",
            "_____________________\n",
            "auc =  0.9255709342560554\n",
            "aupr =  0.9195100450905687\n",
            "Score =  0.8411764705882353\n",
            "_____________________\n",
            "auc =  0.9405709342560553\n",
            "aupr =  0.9436341686971389\n",
            "Score =  0.8529411764705882\n",
            "_____________________\n",
            "auc =  0.9323529411764706\n",
            "aupr =  0.8984897420951431\n",
            "Score =  0.8911764705882353\n",
            "_____________________\n",
            "auc =  0.9399653979238753\n",
            "aupr =  0.9221935909719287\n",
            "Score =  0.861764705882353\n",
            "_____________________\n",
            "auc =  0.9001384083044983\n",
            "aupr =  0.8914825610059562\n",
            "Score =  0.8235294117647058\n",
            "_____________________\n",
            "auc =  0.9412110726643599\n",
            "aupr =  0.9139544537576471\n",
            "Score =  0.861764705882353\n",
            "_____________________\n",
            "auc =  0.9348788927335641\n",
            "aupr =  0.9227281223238456\n",
            "Score =  0.861764705882353\n",
            "_____________________\n",
            "auc =  0.9273929690219284\n",
            "aupr =  0.8991101932379078\n",
            "Score =  0.8495575221238938\n",
            "_____________________\n",
            "auc =  0.9429168116950922\n",
            "aupr =  0.9443347520590181\n",
            "Score =  0.8820058997050148\n",
            "_____________________\n",
            "Mean Score: 0.8540386951240672\n",
            "Mean AUC: 0.9273389365492107\n",
            "Mean AUPR: 0.9117367051219821\n",
            "________________________\n"
          ]
        },
        {
          "data": {
            "image/png": "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8+bNK1O+PIKVvMflcjF9+nT++9//kpaWxrx580hLSytRJjU1lVdeeYXvv/+e9evXs3jxYrZu3QoYgb/ly5ezfv16UlJS+OSTT1i1alWF91u5ciXXX399jW2qrExYWBhPP/00aWlprFq1ijlz5pCWlkZERATnnnsu77777gk8qfIJVH1UgClAD1V91JOv+GRV/b6KUxsURQXhqEJMbDGqWr+5in/6CTZtMvLQf/wjjBxZ9TmWgKhmPpmACVTZZOzYsSxZsoSJEycyb948rr76ap/w3L/+9S9mz55NcXExw4cPZ+7cuYSGhnLZZZeRkZFBYWEhd9xxB9OmTSM9PZ2LLrqIkSNH8s0339C5c2c++ugjoqOjK73/mWeeyQaPCu3y5cuJiori17/+NWBaDs8++yzdu3fnkUceYdWqVeUm0ymPt99+m3feece3nZuby1dffcWKFSu45JJLfDkTKqOi5D015fvvvycxMZEePXoAMHnyZD766CP69TueFPHHH39k+PDhxMTEADB69Gj+/e9/c8899yAitGjRAjCifQ6Ho8a9BYHYVFmZU045xScn3rJlS/r27cuePXvo168fl112Gffddx9TpkypkY1eAn0TzgXOBK72bOdg0lA2KgrzwgElJroYpR5SVB45cnz9oovgnnvgvfesE2hiTJ48mfnz51NYWMiGDRsYPnw4YF5E7777Ll9//TUpKSmEhoby9ttvA+Zre+3ataxZs4bZs2eTlZUFwM8//8z06dPZtGkTrVu35n3vzPIKcLlcLFu2jPHjja7jpk2byiTLadWqFQkJCWzdurXSZDr+FBcXs337drp16+bb99FHH3HhhRfSu3dv2rVrx9q1a6u8TqD3AzjrrLNITk4usyxdurRM2T179tCly3HV+/j4ePbsKSmCkJSUxJdffklWVhb5+fl8/PHHZGQcz53lcrlITk6mY8eOnHfeeb7fmz/Dhw8nOTmZm266iUWLFvls+vTTT0/IpkDKgOlu++GHH3w2JSUlsXr16jLlTpRAg8XDVXWwiPwAoKpHPNLSjYqiApNdMya6GHUrIeF15AgKC02KyIUL4a23oHt30/1z1VV1c/9mxgloEtYqAwcOJD09nXnz5jHWL96zbNky1q5d61MZLSgooKMnYdDs2bP54AMj35WRkcHPP//MySefTPfu3UlOTgZKJqgpTUFBAcnJ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",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "skf = StratifiedKFold(n_splits=10)\n",
        "# skf.get_n_splits(X, y)\n",
        "score=[]\n",
        "AUC=[]\n",
        "AUPR=[]\n",
        "X= np.array(X)\n",
        "y=np.array(y)\n",
        "tprs = []\n",
        "aucs = []\n",
        "mean_fpr = np.linspace(0, 1, 100)\n",
        "fig, ax = plt.subplots()\n",
        "for train_index, test_index in skf.split(X, y):\n",
        "    #  print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
        "     x_train, x_test = X[train_index], X[test_index]\n",
        "     y_train, y_test = y[train_index], y[test_index]\n",
        "     clf = LogisticRegression(solver=\"liblinear\", class_weight = 'balanced', max_iter=10000).fit(x_train, y_train)\n",
        "    #  clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "    #  clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "    #  clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "     viz = plot_roc_curve(clf, x_test, y_test,\n",
        "                         name='ROC fold {}'.format(i),\n",
        "                         alpha=0.3, lw=1, ax=ax)\n",
        "     interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)\n",
        "     interp_tpr[0] = 0.0\n",
        "     tprs.append(interp_tpr)\n",
        "     aucs.append(viz.roc_auc)\n",
        "     y_hat= clf.predict_proba(x_test)[:,1]\n",
        "    #  y_hat= clf.predict(x_test)\n",
        "     A = roc_auc_score(y_test, y_hat)\n",
        "    #  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "     AUC.append(A)\n",
        "     print(\"auc = \", A)\n",
        "     precision, recall, thresholds = precision_recall_curve(y_test, y_hat)\n",
        "    #  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "     PR = auc(recall, precision)\n",
        "     AUPR.append(PR)\n",
        "     print(\"aupr = \", PR)\n",
        "     sc= clf.score(x_test, y_test)\n",
        "     score.append(sc)\n",
        "     print(\"Score = \", sc)\n",
        "     print(\"_____________________\")\n",
        "print(\"Mean Score:\",mean_cal(score))\n",
        "print(\"Mean AUC:\",mean_cal(AUC))\n",
        "print(\"Mean AUPR:\",mean_cal(AUPR))\n",
        "print(\"________________________\")\n",
        "\n",
        "\n",
        "ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',\n",
        "        label='Chance', alpha=.8)\n",
        "\n",
        "mean_tpr = np.mean(tprs, axis=0)\n",
        "mean_tpr[-1] = 1.0\n",
        "mean_auc = auc(mean_fpr, mean_tpr)\n",
        "std_auc = np.std(aucs)\n",
        "ax.plot(mean_fpr, mean_tpr, color='b',\n",
        "        label=r'Mean ROC (AUC = %0.2f $\\pm$ %0.2f)' % (mean_auc, std_auc),\n",
        "        lw=2, alpha=.8)\n",
        "\n",
        "std_tpr = np.std(tprs, axis=0)\n",
        "tprs_upper = np.minimum(mean_tpr + std_tpr, 1)\n",
        "tprs_lower = np.maximum(mean_tpr - std_tpr, 0)\n",
        "ax.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,\n",
        "                label=r'$\\pm$ 1 std. dev.')\n",
        "\n",
        "ax.set(xlim=[-0.05, 1.05], ylim=[-0.05, 1.05],\n",
        "       title=\"Receiver operating characteristic example\")\n",
        "ax.legend(loc=\"lower right\")\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 89,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "RCeuHVIM5cHE",
        "outputId": "12d08a7a-012c-4fb2-86f2-6aef33b56f31"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc-roc =  0.7933125433125432\n",
            "auc-pr =  0.8524558791619452\n",
            "0.7470555970778987\n",
            "Acc =  0.7960526315789473\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.75      0.90      0.82        78\n",
            "           1       0.86      0.69      0.77        74\n",
            "\n",
            "    accuracy                           0.80       152\n",
            "   macro avg       0.81      0.79      0.79       152\n",
            "weighted avg       0.81      0.80      0.79       152\n",
            "\n"
          ]
        }
      ],
      "source": [
        "# the main test set\n",
        "X_me = []\n",
        "Y_me = []\n",
        "for a in A_test:\n",
        "  sample = a.split(\" \")\n",
        "  dname =sample[0]\n",
        "  disname = sample[2].split(\".\")\n",
        "  X_me.append(np.concatenate((model1[(dname.rstrip().lower())], model1[(disname[0].lstrip().lower())]), axis=None))\n",
        "  Y_me.append(1)\n",
        "for idx, i in I.iterrows():\n",
        "  if(i.ind_id in my_disease_list and i.drug_id in my_drug_list):\n",
        "    X_me.append(np.concatenate((model1[i.drug_id.lower()], model1[i.ind_id.lower()]), axis=None))\n",
        "    # X_me.append((model1[i.drug_id.lower()]- model1[i.ind_id.lower()]))\n",
        "    Y_me.append(0)\n",
        "\n",
        "# trainng the model on the train set and evaluate on the test set\n",
        "\n",
        "\n",
        "# clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000, penalty='l2').fit(X, y) \n",
        "# clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(X, y)\n",
        "clf = DecisionTreeClassifier().fit(X, y)\n",
        "# clf = RandomForestClassifier().fit(X, y)\n",
        "\n",
        "y_hat = clf.predict_proba(X_me)[:,1]\n",
        "A = roc_auc_score(Y_me, y_hat)\n",
        "\n",
        "#  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "print(\"auc-roc = \", A)\n",
        "precision, recall, thresholds = precision_recall_curve(Y_me, y_hat)\n",
        "\n",
        "#  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "PR = auc(recall, precision)\n",
        "\n",
        "print(\"auc-pr = \", PR)\n",
        "print(average_precision_score(Y_me, clf.predict_proba(X_me)[:,1]))\n",
        "sc= clf.score(X_me, Y_me)\n",
        "\n",
        "print(\"Acc = \", sc)\n",
        "print(classification_report(Y_me, clf.predict(X_me)))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EEqC_NBhyygv"
      },
      "source": [
        "#Test the model on \n",
        "rf+ovun+5+150+concat\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "rbO4HZ52EDFB"
      },
      "outputs": [],
      "source": [
        "\n",
        "frames = [has, hasnt]\n",
        "\n",
        "f = pd.concat(frames)\n",
        "X=[]\n",
        "for idx, row in f.iterrows():\n",
        "  X.append(np.concatenate((model1[(row.drug_id).lower()], model1[(row.ind_id).lower()]), axis=None))\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "47vDSGjzEDFC"
      },
      "outputs": [],
      "source": [
        "y=np.zeros((len(X), ))\n",
        "\n",
        "for i in range(has.shape[0]):\n",
        "  y[i]=1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "BETCuayGEDFC",
        "outputId": "6a6d76df-0273-4524-c877-5e93028e01bd"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "3592\n",
            "3402\n"
          ]
        }
      ],
      "source": [
        "from imblearn.over_sampling import SMOTE, RandomOverSampler\n",
        "from imblearn.under_sampling import RandomUnderSampler\n",
        "over = SMOTE(0.9)\n",
        "# over = RandomOverSampler(0.9)\n",
        "under = RandomUnderSampler()\n",
        "X, y = over.fit_resample(X,y)\n",
        "print(len(X))\n",
        "X,y = under.fit_resample(X,y)\n",
        "print(len(X))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "S7H8tVRkKCU7"
      },
      "outputs": [],
      "source": [
        "X_me = []\n",
        "Y_me = []\n",
        "for a in A_test:\n",
        "  sample = a.split(\" \")\n",
        "  dname =sample[0]\n",
        "  disname = sample[2].split(\".\")\n",
        "  X_me.append(np.concatenate((model1[(dname.rstrip().lower())], model1[(disname[0].lstrip().lower())]), axis=None))\n",
        "  # X_me.append((model1[(dname.rstrip().lower())]- model1[(disname[0].lstrip().lower())]))\n",
        "  Y_me.append(1)\n",
        "for idx, i in I.iterrows():\n",
        "  X_me.append(np.concatenate((model1[i.drug_id.lower()], model1[i.ind_id.lower()]), axis=None))\n",
        "  # X_me.append((model1[i.drug_id.lower()]- model1[i.ind_id.lower()]))\n",
        "  Y_me.append(0)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Isru2QiuwOb4",
        "outputId": "fc2c56c3-ed1b-4843-ea1b-cd2593481811"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.8782051282051282\n",
            "aupr =  0.8343833283168789\n",
            "0.8415509167417345\n",
            "Score =  0.7948717948717948\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.77      0.85      0.80        78\n",
            "           1       0.83      0.74      0.78        78\n",
            "\n",
            "    accuracy                           0.79       156\n",
            "   macro avg       0.80      0.79      0.79       156\n",
            "weighted avg       0.80      0.79      0.79       156\n",
            "\n"
          ]
        }
      ],
      "source": [
        "clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000, penalty='l2').fit(X, y) # penalti should be changed\n",
        "# clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(X, y)\n",
        "# clf = DecisionTreeClassifier().fit(X, y)\n",
        "# clf = RandomForestClassifier().fit(X, y)\n",
        "\n",
        "y_hat = clf.predict_proba(X_me)[:,1]\n",
        "A = roc_auc_score(Y_me, y_hat)\n",
        "\n",
        "#  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "print(\"auc = \", A)\n",
        "precision, recall, thresholds = precision_recall_curve(Y_me, y_hat)\n",
        "\n",
        "#  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "PR = auc(recall, precision)\n",
        "\n",
        "print(\"aupr = \", PR)\n",
        "print(average_precision_score(Y_me, clf.predict_proba(X_me)[:,1]))\n",
        "sc= clf.score(X_me, Y_me)\n",
        "\n",
        "print(\"Score = \", sc)\n",
        "print(classification_report(Y_me, clf.predict(X_me)))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "Tn-bqlCAFaqy",
        "outputId": "98f59b12-0def-4faf-dfc4-9d9e417e1f8b"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.8790269559500329\n",
            "aupr =  0.8366357006988545\n",
            "Score =  0.7884615384615384\n",
            "_____________________\n",
            "auc =  0.8782051282051282\n",
            "aupr =  0.8361861068845176\n",
            "Score =  0.782051282051282\n",
            "_____________________\n",
            "auc =  0.8800131492439185\n",
            "aupr =  0.8368043618774486\n",
            "Score =  0.7948717948717948\n",
            "_____________________\n",
            "auc =  0.8754109138724523\n",
            "aupr =  0.8342868654068767\n",
            "Score =  0.8012820512820513\n",
            "_____________________\n",
            "auc =  0.8791913214990138\n",
            "aupr =  0.8349816682940633\n",
            "Score =  0.7884615384615384\n",
            "_____________________\n",
            "auc =  0.8775476660092045\n",
            "aupr =  0.8338139409397762\n",
            "Score =  0.8012820512820513\n",
            "_____________________\n",
            "auc =  0.8780407626561473\n",
            "aupr =  0.8347037378335262\n",
            "Score =  0.7884615384615384\n",
            "_____________________\n",
            "auc =  0.8767258382642997\n",
            "aupr =  0.8338727169823523\n",
            "Score =  0.7884615384615384\n",
            "_____________________\n",
            "auc =  0.8767258382642998\n",
            "aupr =  0.8349353096805588\n",
            "Score =  0.7948717948717948\n",
            "_____________________\n",
            "auc =  0.8777120315581854\n",
            "aupr =  0.8349957473632158\n",
            "Score =  0.7756410256410257\n",
            "_____________________\n",
            "Mean Score: 0.7903846153846154\n",
            "Mean AUC: 0.8778599605522684\n",
            "Mean AUPR: 0.835121615596119\n",
            "________________________\n"
          ]
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "skf = StratifiedKFold(n_splits=10)\n",
        "# skf.get_n_splits(X, y)\n",
        "score=[]\n",
        "AUC=[]\n",
        "AUPR=[]\n",
        "X= np.array(X)\n",
        "y=np.array(y)\n",
        "tprs = []\n",
        "aucs = []\n",
        "final_result = []\n",
        "mean_fpr = np.linspace(0, 1, 100)\n",
        "fig, ax = plt.subplots()\n",
        "for train_index, test_index in skf.split(X, y):\n",
        "    #  print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
        "     x_train, x_test = X[train_index], X[test_index]\n",
        "     y_train, y_test = y[train_index], y[test_index]\n",
        "     clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000).fit(x_train, y_train)\n",
        "    #  clf = DecisionTreeClassifier().fit(x_train, y_train)\n",
        "    #  clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(x_train, y_train)\n",
        "    #  clf = RandomForestClassifier().fit(x_train, y_train)\n",
        "     viz = plot_roc_curve(clf, X_me, Y_me,\n",
        "                         name='ROC fold {}'.format(i),\n",
        "                         alpha=0.3, lw=1, ax=ax)\n",
        "     interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)\n",
        "     interp_tpr[0] = 0.0\n",
        "     tprs.append(interp_tpr)\n",
        "     aucs.append(viz.roc_auc)\n",
        "     y_hat= clf.predict_proba(X_me)[:,1]\n",
        "    #  y_hat= clf.predict(X_me)\n",
        "     final_result.append(y_hat)\n",
        "     \n",
        "     A = roc_auc_score(Y_me, y_hat)\n",
        "    #  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "     AUC.append(A)\n",
        "     print(\"auc = \", A)\n",
        "     precision, recall, thresholds = precision_recall_curve(Y_me, y_hat)\n",
        "    #  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "     PR = auc(recall, precision)\n",
        "     AUPR.append(PR)\n",
        "     print(\"aupr = \", PR)\n",
        "     sc= clf.score(X_me, Y_me)\n",
        "     score.append(sc)\n",
        "     print(\"Score = \", sc)\n",
        "     print(\"_____________________\")\n",
        "print(\"Mean Score:\",mean_cal(score))\n",
        "print(\"Mean AUC:\",mean_cal(AUC))\n",
        "print(\"Mean AUPR:\",mean_cal(AUPR))\n",
        "print(\"________________________\")\n",
        "\n",
        "\n",
        "ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',\n",
        "        label='Chance', alpha=.8)\n",
        "\n",
        "mean_tpr = np.mean(tprs, axis=0)\n",
        "mean_tpr[-1] = 1.0\n",
        "mean_auc = auc(mean_fpr, mean_tpr)\n",
        "std_auc = np.std(aucs)\n",
        "ax.plot(mean_fpr, mean_tpr, color='b',\n",
        "        label=r'Mean ROC (AUC = %0.2f $\\pm$ %0.2f)'  % (mean_auc, std_auc),\n",
        "        lw=2, alpha=.8)\n",
        "\n",
        "std_tpr = np.std(tprs, axis=0)\n",
        "tprs_upper = np.minimum(mean_tpr + std_tpr, 1)\n",
        "tprs_lower = np.maximum(mean_tpr - std_tpr, 0)\n",
        "ax.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,\n",
        "                label=r'$\\pm$ 1 std. dev.')\n",
        "\n",
        "ax.set(xlim=[-0.05, 1.05], ylim=[-0.05, 1.05],\n",
        "       title=\"Receiver operating characteristic example\")\n",
        "ax.legend(loc=\"lower right\")\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "l6age1x3ZFpk"
      },
      "source": [
        "# Evaluation on Skin related disease"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TAaTaio1Zhgb"
      },
      "source": [
        "We consider atopic eczema and contact dermatities as test case to show how much it can generalized\n",
        "\n",
        "For this purpose, we should design our DDKG again without considering negative or positive associations"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "OcxulzRLaTKy"
      },
      "outputs": [],
      "source": [
        "skin_disease=['C0011615']\n",
        "# skin_disease=['C0011616']"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "NE1GWi7TZwuk"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "associations = A.copy()\n",
        "\n",
        "# making the drug and disease lists\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "0atxPcCKZwuo"
      },
      "outputs": [],
      "source": [
        "\n",
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "  # if row.diseaseId in my_disease_list:\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EcVOyJciZwup"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "mSCquXVHZwup"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "35vp3xXkZwup"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RlMeSKtDZwuq"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "1tlbGb9qZwuq"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_wu_MRZ2Zwur"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WvKjvL_SZwus"
      },
      "source": [
        "Extracting drug-disease associations\n",
        "\n",
        "Positive data: Known drug-disease associations\n",
        "\n",
        "Negative data: a subset of unknown drug-disease associations that disease is an adverse drug reaction and common with our side effects"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4pGcD1AsZwus"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "IqPDZ28LbFN4"
      },
      "outputs": [],
      "source": [
        "A_test=[]\n",
        "for d in my_drug_list:\n",
        "  text = str(d)+\" has_indicated C0011615. \" \n",
        "  if text in associations:\n",
        "    A.remove(text)\n",
        "    A_test.append(text)\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "vSeYZ5SWZwus",
        "outputId": "7dde5329-0159-4f25-b0e8-591854a34594"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of all known drug disease associations in our dataset:  (748, 2)\n",
            "The number of  known drug disease associations without positive test set: (733, 2)\n"
          ]
        }
      ],
      "source": [
        "\n",
        "print(\"The number of all known drug disease associations in our dataset: \",(has.shape))\n",
        "\n",
        "I=[]\n",
        "for idx, row in has.iterrows():\n",
        "  text=str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  if text in A_test: # Extracting test associations from positive data\n",
        "    I.append(idx)\n",
        "has = has.drop(index=I, axis=0)\n",
        "print(\"The number of  known drug disease associations without positive test set:\",has.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MWzS2KZwZwut"
      },
      "outputs": [],
      "source": [
        "\n",
        "I=[]\n",
        "u=0\n",
        "\n",
        "hasnt_test_idx=[]\n",
        "for idx, row in hasnt.iterrows():\n",
        " if row.ind_id == \"C0011615\":\n",
        "  #  print(row)\n",
        "   text = str(row.drug_id)+\" has_sideeffect C0011615. \"\n",
        "   if(text in S):\n",
        "     hasnt_test_idx.append(idx)\n",
        "     I.append(row)\n",
        "     S.remove(text)\n",
        "     u+=1\n",
        "\n",
        "hasnt = hasnt.drop(index=hasnt_test_idx, axis=0)\n",
        "hasnt.shape\n",
        "\n",
        "I=pd.DataFrame(I)\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mRu0nRd5Zwut"
      },
      "source": [
        "##Word2Vec implementation\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-I8_qgMQZwut"
      },
      "source": [
        "first, we make the file of our DDKG\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "pV-w8qPdZwut"
      },
      "outputs": [],
      "source": [
        "data=[]\n",
        "sets=[chemical, target, side, domain, atccode, ass, Disease]\n",
        "\n",
        "for s in sets:\n",
        "  for i in sent_tokenize(s):\n",
        "      temp = []\n",
        "      # tokenize the sentence into words\n",
        "      for j in word_tokenize(i):\n",
        "          temp.append(j.lower())\n",
        "      data.append(temp)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "N7GMlB5zZwuu"
      },
      "outputs": [],
      "source": [
        "model1 = gensim.models.Word2Vec(min_count = 1, alpha=0.001, size = 700, window = 2, iter=2000, sg=0)\n",
        "model1.build_vocab(data, progress_per=10000)\n",
        "model1.train(data, total_examples=model1.corpus_count, epochs=500, report_delay=1)\n",
        "model1.init_sims(replace=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "yZ4YiUvSZwuu"
      },
      "outputs": [],
      "source": [
        "def mean_cal(K):\n",
        "  sum=0\n",
        "  for k in K:\n",
        "    sum= sum+k\n",
        "  return(sum/len(K))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Dwxf6Lyydr8G"
      },
      "source": [
        "## training a logistic regression"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "YSPkCJpAeAHj"
      },
      "outputs": [],
      "source": [
        "frames = [has, hasnt]\n",
        "\n",
        "f = pd.concat(frames)\n",
        "X=[]\n",
        "for idx, row in f.iterrows():\n",
        "  X.append(np.concatenate((model1[(row.drug_id).lower()], model1[(row.ind_id).lower()]), axis=None))\n",
        "y=np.zeros((len(X), ))\n",
        "\n",
        "for i in range(has.shape[0]):\n",
        "  y[i]=1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "IxXEbRGVeAHm",
        "outputId": "6d443412-1a99-4c62-e0d5-9b4e882e45f7"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "3659\n",
            "3466\n"
          ]
        }
      ],
      "source": [
        "over = SMOTE(0.9)\n",
        "# over = RandomOverSampler(0.9)\n",
        "under = RandomUnderSampler()\n",
        "X, y = over.fit_resample(X,y)\n",
        "print(len(X))\n",
        "X,y = under.fit_resample(X,y)\n",
        "print(len(X))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "TBWPVCy9eAHn"
      },
      "outputs": [],
      "source": [
        "X_me = []\n",
        "Y_me = []\n",
        "\n",
        "for a in A_test:\n",
        "  sample = a.split(\" \")\n",
        "  dname =sample[0]\n",
        "  disname = sample[2].split(\".\")\n",
        "  X_me.append(np.concatenate((model1[(dname.rstrip().lower())], model1[(disname[0].lstrip().lower())]), axis=None))\n",
        "  # X_me.append((model1[(dname.rstrip().lower())]- model1[(disname[0].lstrip().lower())]))\n",
        "  Y_me.append(1)\n",
        "for idx, i in I.iterrows():\n",
        "  X_me.append(np.concatenate((model1[i.drug_id.lower()], model1[i.ind_id.lower()]), axis=None))\n",
        "  # X_me.append((model1[i.drug_id.lower()]- model1[i.ind_id.lower()]))\n",
        "  Y_me.append(0)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "IUri3suxeAHn",
        "outputId": "3a19ab8b-45b8-4a90-91fb-1fe2328100f9"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "auc =  0.9583333333333334\n",
            "aupr =  0.8891733683101969\n"
          ]
        }
      ],
      "source": [
        "clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000, penalty='l2').fit(X, y) # penalti should be changed\n",
        "# clf = svm.SVC(kernel=\"linear\", class_weight=\"balanced\").fit(X, y)\n",
        "# clf = DecisionTreeClassifier().fit(X, y)\n",
        "# clf = RandomForestClassifier().fit(X, y)\n",
        "\n",
        "y_hat = clf.predict_proba(X_me)[:,1]\n",
        "A = roc_auc_score(Y_me, y_hat)\n",
        "\n",
        "#  A = roc_auc_score(y_test, clf.decision_function(x_test))\n",
        "print(\"auc = \", A)\n",
        "precision, recall, thresholds = precision_recall_curve(Y_me, y_hat)\n",
        "\n",
        "#  precision, recall, thresholds = precision_recall_curve(y_test, clf.decision_function(x_test))\n",
        "PR = auc(recall, precision)\n",
        "\n",
        "print(\"aupr = \", PR)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uH_UQRWjHOm-"
      },
      "source": [
        "Now, we calculate the association score between our disease and all drugs to find the first 10 reltaed drugs to them"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Np3OT4zwptoH"
      },
      "outputs": [],
      "source": [
        "skin_disease=['C0011615']\n",
        "\n",
        "SCOR_PD=pd.DataFrame(columns={\"Dis_id\", \"Drug_id\", \"Score\"}) # To save association score\n",
        "for dis in skin_disease:\n",
        "  for drug in my_drug_list:\n",
        "    x=np.concatenate((model1[(drug).lower()], model1[(dis).lower()]), axis=None)\n",
        "    # x= x.reshape(-1, 1)\n",
        "    s = clf.predict_proba([x])[:,1]\n",
        "    # s = clf.predict([x])\n",
        "    df2 = {\"Dis_id\":dis, \"Drug_id\":drug, \"Score\":s}\n",
        "    SCOR_PD = SCOR_PD.append(df2, ignore_index = True)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "-F-8rSUC7KJ2",
        "outputId": "b8ab6d46-fc03-479b-9cc9-8f92a342f98e"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "All: 15 Sum: 5\n"
          ]
        }
      ],
      "source": [
        "top10_drugs=[]  \n",
        "for dis in skin_disease:\n",
        "  dis_pd = SCOR_PD[SCOR_PD.Dis_id == dis]\n",
        "  m = dis_pd.Score.max()\n",
        "  dis_pd = dis_pd.sort_values(by='Score', ascending=False) # First we sort the scores\n",
        "  dis_pd = dis_pd.head(10) # Extract the top 10\n",
        "  sum=0 \n",
        "  \n",
        "  for idx, row in dis_pd.iterrows():\n",
        "    text = str(row.Drug_id)+' has_indicated '+str(dis)+'. '   # Check is there any association between them in our dataset or not\n",
        "    if text in associations:\n",
        "      sum+=1 # if there is, we count it\n",
        "    all=0\n",
        "    for d in my_drug_list:  # Here we find the number of all related drugs to the disease\n",
        "      text = str(d)+' has_indicated '+str(dis)+'. '\n",
        "      if text in associations:\n",
        "        all+=1\n",
        "        # print(text)\n",
        "  if(all!=0):\n",
        "    print(\"All:\", all, \"Sum:\", sum)\n",
        "    if(all>10):\n",
        "      top10_drugs.append(sum/10)  \n",
        "    else:\n",
        "      top10_drugs.append(sum/all)\n",
        "  else:\n",
        "    top10_drugs.append(0)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NvI90Bl8v8UC"
      },
      "source": [
        "###find unknown associations\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "lMknmuOpqTNH",
        "outputId": "d4dbe52f-cf74-4ddb-9d8e-5b16d1383fcb"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "DB00259 has_indicated C0011615. \n",
            "DB00324 has_indicated C0011615. \n",
            "DB00634 has_indicated C0011615. \n",
            "DB00838 has_indicated C0011615. \n",
            "DB00394 has_indicated C0011615. \n"
          ]
        }
      ],
      "source": [
        "for id in skin_disease:\n",
        "  dis_pd = SCOR_PD[SCOR_PD.Dis_id==id]\n",
        "  dis_pd = dis_pd.sort_values(by='Score', ascending=False)\n",
        "  dis_pd = dis_pd.head(10)\n",
        "  for idx, row in dis_pd.iterrows():\n",
        "    text = str(row.Drug_id)+' has_indicated '+str(row.Dis_id)+'. '\n",
        "    if not(text in associations):\n",
        "      print(text)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "sCs2OJFUpPsP"
      },
      "source": [
        "# Covid Drugs"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hgS3UGCwpOcD"
      },
      "outputs": [],
      "source": [
        "ass = pd.read_csv(\"my_repodb.txt\") \n",
        "ass.set_index(\"Unnamed: 0\", inplace=True)\n",
        "disgenet = pd.read_csv(\"Gen-Dis-association-Disgenet-2022 - CORONA VIRUS INFECTION.csv\")\n",
        "\n",
        "# making the drug and disease lists\n",
        "my_disease_list = list(set(ass.ind_id))\n",
        "my_disease_list.append(\"C0206750\")\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "drugs=list(set(ass.drug_id))\n",
        "disgenet = disgenet.loc[disgenet['diseaseId'].isin(my_disease_list)]\n",
        "my_disease_list = list(set(disgenet.diseaseId))\n",
        "ass = ass.loc[ass['ind_id'].isin(my_disease_list)]\n",
        "my_drug_list = list(set(ass.drug_id))\n",
        "\n",
        "\n",
        "covid_drugs= pd.read_csv(\"Covid-19 drugs from drugbank.csv\")\n",
        "covid_drugs"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2P47MfmEqo44"
      },
      "outputs": [],
      "source": [
        "i=0\n",
        "my_covid_drug = []\n",
        "for d in covid_drugs.drug_id:\n",
        "  if d in my_drug_list:\n",
        "    my_covid_drug.append(d)\n",
        "    i+=1\n",
        "print(i)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "xm8q7VkYrf7S"
      },
      "outputs": [],
      "source": [
        "has = pd.read_csv(\"my_repodb.txt\") # Positive data: Known Drug-Disease associations\n",
        "has.set_index(\"Unnamed: 0\", inplace=True)\n",
        "has = has.drop(['drug_name', 'ind_name','NCT','status', 'phase',\n",
        "       'DetailedStatus'], axis=1)\n",
        "has = has.loc[has['ind_id'].isin(my_disease_list)]\n",
        "\n",
        "\n",
        "hasnt = pd.read_csv(\"my_only_negatives.txt\") # Negative data: Unknown Drug-Disease associations when disease is adverse drug reaction\n",
        "hasnt.set_index(\"Unnamed: 0\", inplace=True)\n",
        "hasnt = hasnt.rename(columns={\"Not_indicated_for\":\"ind_id\", \"Drug_id\": \"drug_id\"})\n",
        "hasnt = hasnt.loc[hasnt['ind_id'].isin(my_disease_list)]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4HZHiP7Qr1GQ"
      },
      "outputs": [],
      "source": [
        "\n",
        "\n",
        "# making the relation of diseases: has_geneid, has_class, has_semantic, has_type\n",
        "\n",
        "C=[]\n",
        "num1=0\n",
        "num2=0\n",
        "num3=0\n",
        "num4=0\n",
        "for idx, row in disgenet.iterrows():\n",
        "  # if row.diseaseId in my_disease_list:\n",
        "      semtype = \"_\".join(row.diseaseSemanticType.split())\n",
        "      clas = row.diseaseClass.split(\";\")\n",
        "      text1 =str(row.diseaseId)+\" has_geneid \"+str(row.geneSymbol)+\". \"\n",
        "      num1+=1\n",
        "      text2 =str(row.diseaseId)+\" has_type \"+str(row.diseaseType)+\". \"\n",
        "      num2+=1\n",
        "      text3 =str(row.diseaseId)+\" has_semantic \"+str(semtype)+\". \"\n",
        "      num3+=1\n",
        "      C.append(text1)\n",
        "      C.append(text2)\n",
        "      C.append(text3)\n",
        "      num4+=len(clas)\n",
        "      for cl in clas:\n",
        "        text =str(row.diseaseId)+\" has_class \"+str(cl)+\". \"\n",
        "        C.append(text)\n",
        "\n",
        "Disease=\"\"\n",
        "for c in C:\n",
        "  Disease= Disease+c\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cWlM-xeNr1GS"
      },
      "source": [
        "making the drug relations: has_sideeffect, has_target, has_domain, has_atccode, has_chemicalstructure"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "LZ_2hzphr1GT"
      },
      "outputs": [],
      "source": [
        "# has_target relation. data is collected using DrugBank\n",
        "T=[]\n",
        "target= pd.read_csv(\"my_target.txt\")\n",
        "target.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in target.iterrows():\n",
        "  for c in target.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_target \"+str(c)+\". \"\n",
        "      T.append(text)\n",
        "target=\"\"\n",
        "for c in T:\n",
        "  target= target+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "zQ5LceZhr1GU"
      },
      "outputs": [],
      "source": [
        "# has_domain relation. data is collected using UniProt\n",
        "D=[]\n",
        "dom= pd.read_csv(\"my_domain.txt\")\n",
        "dom.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in dom.iterrows():\n",
        "  for c in dom.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_domain \"+str(c)+\". \"\n",
        "      D.append(text)\n",
        "\n",
        "domain=\"\"\n",
        "for c in D:\n",
        "  domain= domain+c\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "gzSMNVGmr1GU"
      },
      "outputs": [],
      "source": [
        "# has_chemical relation. data is collected using Pubchem\n",
        "C=[]\n",
        "finger= pd.read_csv(\"my_finger.txt\")\n",
        "finger.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in finger.iterrows():\n",
        "  for c in finger.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_chemical S\"+str(c)+\". \"\n",
        "      C.append(text)\n",
        "chemical=\"\"\n",
        "for c in C:\n",
        "  chemical= chemical+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2wjHaae0r1GV"
      },
      "outputs": [],
      "source": [
        "# has_atc_code relation. data is collected using Sider4.1\n",
        "\n",
        "ATC=[]\n",
        "atc= pd.read_csv(\"my_ATC.txt\")\n",
        "atc.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in atc.iterrows():\n",
        "  for c in atc.columns:\n",
        "    if row[c] == 1 and (len(c)==4 or len(c)==1 or len(c)==3 or len(c)==5): # we consider first 4 level of ATC code\n",
        "      text =str(idx)+\" has_atc_code \"+str(c)+\". \"\n",
        "      ATC.append(text)\n",
        "atccode=\"\"\n",
        "for c in ATC:\n",
        "  atccode= atccode+c"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true
        },
        "id": "6cFK6ZCdr1GV"
      },
      "outputs": [],
      "source": [
        "# has_sideeffect relation. Date is collected using Sider4.1\n",
        "S=[]\n",
        "side= pd.read_csv(\"my_sideeffect.txt\")\n",
        "side.set_index(\"Unnamed: 0\", inplace=True)\n",
        "for idx, row in side.iterrows():\n",
        "  for c in side.columns:\n",
        "    if row[c] ==1 :\n",
        "      text =str(idx)+\" has_sideeffect \"+str(c)+\". \"\n",
        "      S.append(text)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true
        },
        "id": "kMGpynGCsGQP"
      },
      "outputs": [],
      "source": [
        "A=[]\n",
        "for ix, row in ass.iterrows():\n",
        "  text = str(row.drug_id)+\" has_indicated \"+str(row.ind_id)+\". \"\n",
        "  A.append(text)\n",
        "\n",
        "ass=\"\" # making the new associations for training the models\n",
        "for c in A:\n",
        "  ass= ass+c\n",
        "\n",
        "side=\"\"\n",
        "for c in S:\n",
        "  side= side+c\n",
        "\n",
        "I = hasnt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "60eP_PiC7Dze"
      },
      "source": [
        "## Word2Vec"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "M0aV8hRG689i"
      },
      "outputs": [],
      "source": [
        "\n",
        "data=[]\n",
        "sets=[chemical, target, side, domain, atccode, ass, Disease]\n",
        "\n",
        "for s in sets:\n",
        "  for i in sent_tokenize(s):\n",
        "      temp = []\n",
        "      # tokenize the sentence into words\n",
        "      for j in word_tokenize(i):\n",
        "          temp.append(j.lower())\n",
        "      data.append(temp)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "LLug2LnG689k"
      },
      "outputs": [],
      "source": [
        "word_freq = defaultdict(int)\n",
        "for sent in data:\n",
        "    for i in sent:\n",
        "        word_freq[i] += 1\n",
        "len(word_freq)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Ufx5RF_F689m"
      },
      "outputs": [],
      "source": [
        "model1 = gensim.models.Word2Vec(min_count = 1, alpha=0.001, size = 700, window = 2, iter=2000, sg=0)\n",
        "model1.build_vocab(data, progress_per=10000)\n",
        "model1.train(data, total_examples=model1.corpus_count, epochs=500, report_delay=1)\n",
        "model1.init_sims(replace=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UMbbKYXEx8jG"
      },
      "source": [
        "## Test on COVID-19"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "sN3a1-Nwx_v6"
      },
      "outputs": [],
      "source": [
        "frames = [has, hasnt]\n",
        "\n",
        "f = pd.concat(frames)\n",
        "X=[]\n",
        "for idx, row in f.iterrows():\n",
        "  X.append(np.concatenate((model1[(row.drug_id).lower()], model1[(row.ind_id).lower()]), axis=None))\n",
        "y=np.zeros((len(X), ))\n",
        "\n",
        "for i in range(has.shape[0]):\n",
        "  y[i]=1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ikyw8bqRx_v7"
      },
      "outputs": [],
      "source": [
        "over = SMOTE(0.9)\n",
        "# over = RandomOverSampler(0.9)\n",
        "under = RandomUnderSampler()\n",
        "X, y = over.fit_resample(X,y)\n",
        "print(len(X))\n",
        "X,y = under.fit_resample(X,y)\n",
        "print(len(X))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_0J4KEulx_v8"
      },
      "outputs": [],
      "source": [
        "X_me = []\n",
        "Y_me = []\n",
        "\n",
        "for a in A_test:\n",
        "  sample = a.split(\" \")\n",
        "  dname =sample[0]\n",
        "  disname = sample[2].split(\".\")\n",
        "  X_me.append(np.concatenate((model1[(dname.rstrip().lower())], model1[(disname[0].lstrip().lower())]), axis=None))\n",
        "  # X_me.append((model1[(dname.rstrip().lower())]- model1[(disname[0].lstrip().lower())]))\n",
        "  Y_me.append(1)\n",
        "for idx, i in I.iterrows():\n",
        "  X_me.append(np.concatenate((model1[i.drug_id.lower()], model1[i.ind_id.lower()]), axis=None))\n",
        "  # X_me.append((model1[i.drug_id.lower()]- model1[i.ind_id.lower()]))\n",
        "  Y_me.append(0)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "G8hzyomPx_v8"
      },
      "outputs": [],
      "source": [
        "clf = LogisticRegression(solver=\"sag\", class_weight = 'balanced', max_iter=10000, penalty='l2').fit(X, y) # penalti should be changed\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EmU8BBJAx_v9"
      },
      "source": [
        "Now, we calculate the association score between our disease and all drugs to find the first 10 reltaed drugs to them"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "U8pfy6_kx_v9"
      },
      "outputs": [],
      "source": [
        "covid_disease=['C0206750']\n",
        "\n",
        "SCOR_PD=pd.DataFrame(columns={\"Dis_id\", \"Drug_id\", \"Score\"}) # To save association score\n",
        "for dis in covid_disease:\n",
        "  for drug in my_drug_list:\n",
        "    x=np.concatenate((model1[(drug).lower()], model1[(dis).lower()]), axis=None)\n",
        "    # x= x.reshape(-1, 1)\n",
        "    s = clf.predict_proba([x])[:,1]\n",
        "    # s = clf.predict([x])\n",
        "    df2 = {\"Dis_id\":dis, \"Drug_id\":drug, \"Score\":s}\n",
        "    SCOR_PD = SCOR_PD.append(df2, ignore_index = True)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 419
        },
        "id": "LscCtcoyyxtl",
        "outputId": "c5205a5e-39ec-4c11-965d-48fcb5c707c2"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "\n",
              "  <div id=\"df-968bdcc9-b3d2-47aa-84fc-3f5e101bb797\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Score</th>\n",
              "      <th>Dis_id</th>\n",
              "      <th>Drug_id</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>84</th>\n",
              "      <td>[0.966568243958105]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00663</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>328</th>\n",
              "      <td>[0.9641678658635396]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00240</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>238</th>\n",
              "      <td>[0.9621519180869536]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00324</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>32</th>\n",
              "      <td>[0.9604907096508107]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00259</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>186</th>\n",
              "      <td>[0.9596351838219059]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00223</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>24</th>\n",
              "      <td>[0.20267179723169682]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00188</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>196</th>\n",
              "      <td>[0.19662031258509288]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00413</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>219</th>\n",
              "      <td>[0.19529571178530059]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00268</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>156</th>\n",
              "      <td>[0.16703778980002382]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00215</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>402</th>\n",
              "      <td>[0.16399272804695458]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB01175</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>410 rows × 3 columns</p>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-968bdcc9-b3d2-47aa-84fc-3f5e101bb797')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-968bdcc9-b3d2-47aa-84fc-3f5e101bb797 button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-968bdcc9-b3d2-47aa-84fc-3f5e101bb797');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ],
            "text/plain": [
              "                     Score    Dis_id  Drug_id\n",
              "84     [0.966568243958105]  C0206750  DB00663\n",
              "328   [0.9641678658635396]  C0206750  DB00240\n",
              "238   [0.9621519180869536]  C0206750  DB00324\n",
              "32    [0.9604907096508107]  C0206750  DB00259\n",
              "186   [0.9596351838219059]  C0206750  DB00223\n",
              "..                     ...       ...      ...\n",
              "24   [0.20267179723169682]  C0206750  DB00188\n",
              "196  [0.19662031258509288]  C0206750  DB00413\n",
              "219  [0.19529571178530059]  C0206750  DB00268\n",
              "156  [0.16703778980002382]  C0206750  DB00215\n",
              "402  [0.16399272804695458]  C0206750  DB01175\n",
              "\n",
              "[410 rows x 3 columns]"
            ]
          },
          "execution_count": 30,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "SCOR_PD = SCOR_PD.sort_values(by='Score', ascending=False)\n",
        "SCOR_PD"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 266
        },
        "id": "lUc7raFCzEhw",
        "outputId": "70867ee8-628f-4a17-ebf3-ce98161cc8ad"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "\n",
              "  <div id=\"df-104882d2-483a-4db5-968b-bb5117d13a2a\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Score</th>\n",
              "      <th>Dis_id</th>\n",
              "      <th>Drug_id</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>82</th>\n",
              "      <td>[0.9252709530295148]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB01234</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>[0.9084346898709634]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00959</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>69</th>\n",
              "      <td>[0.8754586677460166]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00608</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>108</th>\n",
              "      <td>[0.8705758796599655]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB01394</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>353</th>\n",
              "      <td>[0.7372971537664909]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB00207</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>61</th>\n",
              "      <td>[0.6238683309087277]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB01050</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>392</th>\n",
              "      <td>[0.6216779080024117]</td>\n",
              "      <td>C0206750</td>\n",
              "      <td>DB08868</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-104882d2-483a-4db5-968b-bb5117d13a2a')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-104882d2-483a-4db5-968b-bb5117d13a2a button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-104882d2-483a-4db5-968b-bb5117d13a2a');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ],
            "text/plain": [
              "                    Score    Dis_id  Drug_id\n",
              "82   [0.9252709530295148]  C0206750  DB01234\n",
              "10   [0.9084346898709634]  C0206750  DB00959\n",
              "69   [0.8754586677460166]  C0206750  DB00608\n",
              "108  [0.8705758796599655]  C0206750  DB01394\n",
              "353  [0.7372971537664909]  C0206750  DB00207\n",
              "61   [0.6238683309087277]  C0206750  DB01050\n",
              "392  [0.6216779080024117]  C0206750  DB08868"
            ]
          },
          "execution_count": 33,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df = SCOR_PD.loc[SCOR_PD[\"Drug_id\"].isin(my_covid_drug)]\n",
        "df"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [
        "OZEjehlD9jb3",
        "E4DPQo6ciHJF",
        "Vkx6IPHxtWty",
        "OMH8JGZ0RfLi",
        "BVm5hdaR-BhZ",
        "2VbrpqNw6cDq",
        "YOMdcp3u5hQI",
        "mGIA9oFoMS_o",
        "4ocxfgkg4f73",
        "EEqC_NBhyygv",
        "l6age1x3ZFpk",
        "sCs2OJFUpPsP"
      ],
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
